我试图对几个连续的行进行分组(并为它们分配相同的值),同时将某些行留空(当未满足某个条件时)。
我的数据是位置(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
...
我想为 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
我尝试了几种带有循环“for”加“ifelse”条件的算法,例如:
Sequence <- for (i in 1:max(ID)) {
ifelse (Span <= 4, i+1, "NA")
}
没有任何运气。我知道我的尝试是不正确的,但我的编程技能非常基础,而且我在网络上没有发现任何类似的问题。
任何想法将不胜感激!
这是一个稍长的衬里:
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
解释:
-
x
是 TRUE/FALSE 的向量,显示其中Span
is 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
to Span == 4
.
- 因为上面的向量比
x
,我预先准备了head(x, 1)
在它前面。head(x, 1)
是一种安全的写作方式x[1]
.
- 然后我采取
cumsum
因此它将向量 TRUE/FALSE 转换为递增整数的向量:Span
跳自!=4
to ==4
它增加 1,否则保持不变。
- 一切都被包裹在一个
ifelse
所以你只能看到数字x
是 TRUE,即,其中Span == 4
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)