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)
没有运气.我知道我的尝试不正确,但我的编程技巧非常基本,我在网上没有发现任何类似的问题.
任何想法将非常感谢!
这是一个很长的一个班轮:
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示出的向量Span是4.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.