将序列中的值分配给一组连续的行,将某些行留空

sbl*_*uez 3 r rows sequence conditional-statements

我正在尝试将几个连续的行分组(并为它们分配相同的值),同时将一些行留空(当某个条件未满足时).

我的数据是位置(xy坐标),测量它们的日期/时间以及测量之间的时间跨度.以某种方式简化,它们看起来像这样:

ID   X     Y      Time    Span
1    3445  7671   0:00    -
2    3312  7677   4:00    4
3    3309  7680   12:00   8
4    3299  7681   16:00   4
5    3243  7655   20:00   4
6    3222  7612   4:00    8
7    3260  7633   0:00    4
8    3254  7641   8:00    8
9    3230  7612   0:00    16
10   3203  7656   4:00    4
11   3202  7678   8:00    4
12   3159  7609   20:00   12
...
Run Code Online (Sandbox Code Playgroud)

我想为在4小时的时间跨度内测量的每个位置序列分配一个值,并使我的数据看起来像这样:

ID   X     Y      Time    Span  Sequence
1    3445  7671   0:00    -     -
2    3312  7677   4:00    4     1
3    3309  7680   12:00   8     NA
4    3299  7681   16:00   4     2
5    3243  7655   20:00   4     2
6    3222  7612   4:00    8     NA
7    3260  7633   0:00    4     3
8    3254  7641   8:00    8     NA
9    3230  7612   0:00    16    NA
10   3203  7656   4:00    4     4
11   3202  7678   8:00    4     4
12   3159  7609   20:00   12    NA
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几个算法,循环"for"加上"ifelse"条件,如:

Sequence <- for (i in 1:max(ID)) {
ifelse (Span <= 4, i+1, "NA")
}
Run Code Online (Sandbox Code Playgroud)

没有运气.我知道我的尝试不正确,但我的编程技巧非常基本,我在网上没有发现任何类似的问题.

任何想法将非常感谢!

flo*_*del 6

这是一个很长的一个班轮:

ifelse(x <- DF$Span == 4, cumsum(c(head(x, 1), tail(x, -1) - head(x, -1) == 1)), NA)
# [1] NA  1 NA  2  2 NA  3 NA NA  4  4 NA
Run Code Online (Sandbox Code Playgroud)

说明:

  • x是TRUE/FALSE示出的向量Span4.
  • tail(x, -1) 是一种安全的写作方式 x[2:length(x)]
  • head(x, -1) 是一种安全的写作方式 x[1:(length(x)-1)]
  • tail(x, -1) - head(x, -1) == 1是一个TRUE/FALSE向量,显示我们Span != 4去往的地方Span == 4.
  • 因为上面的矢量是一个短的元素x,所以我先head(x, 1)于它前面.head(x, 1)是一种安全的写作方式x[1].
  • 然后我把cumsum它转换为向量TRUE/FALSE转换为增加整数的向量:其中Span跳转!=4==4它增加1,否则保持不变.
  • 一切都被包裹成一个ifelse所以你只看到数字在哪里x是真的,即在哪里Span == 4.