我有一个时间序列数据。当列“ soak”> 3600时,我想对行进行分组和编号。当soak> 3600时,第一行编号为1,因此连续的行编号,直到另一行满足soak> 3600的条件。结果行编号为1、2、3,...重复...
我试图在R中编写一个循环,但是没有用。我对R中的编写循环了解甚少。但是总体思路类似于我的代码所示。还提供了我的数据的一小部分样本。
starts <- structure(list(datetime = structure(c(1440578907, 1440579205,
1440579832, 1440579885, 1440579926, 1440579977, 1440580044, 1440580106,
1440580195, 1440580256, 1440580366, 1440580410, 1440580476, 1440580529,
1440580931, 1440580966, 1440587753, 1440587913, 1440587933, 1440587954
), class = c("POSIXct", "POSIXt"), tzone = ""), soak = c(NA,
70L, 578L, 21L, 2L, 41L, 14L, 16L, 32L, 9L, 45L, 20L, 51L, 25L,
364L, 4L, 6764L, 20L, 4L, 5L)), row.names = c(NA, -20L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x000000000a4d1ef0>)
for (j in 0:length(starts)) {
if(j > startIndex) {
if(starts[j, soak] >= 3600 && starts[j-1, soak]< 3600) {
Group2 == 1
}
}
if(starts[j, soak] >= 3600) {
Group2 <- Group2 + 1
Group2[j] <- 1
} else {
Group2[j] <- Group2
}
}
答案 0 :(得分:2)
这是从底数R开始使用ave
的一种方法-
starts$group <- with(starts,
ave(soak, cumsum(replace(soak, is.na(soak), 0) > 3600), FUN = seq_along)
)
datetime soak group
1 2015-08-26 04:48:27 NA 1
2 2015-08-26 04:53:25 70 2
3 2015-08-26 05:03:52 578 3
4 2015-08-26 05:04:45 21 4
5 2015-08-26 05:05:26 2 5
6 2015-08-26 05:06:17 41 6
7 2015-08-26 05:07:24 14 7
8 2015-08-26 05:08:26 16 8
9 2015-08-26 05:09:55 32 9
10 2015-08-26 05:10:56 9 10
11 2015-08-26 05:12:46 45 11
12 2015-08-26 05:13:30 20 12
13 2015-08-26 05:14:36 51 13
14 2015-08-26 05:15:29 25 14
15 2015-08-26 05:22:11 364 15
16 2015-08-26 05:22:46 4 16
17 2015-08-26 07:15:53 6764 1
18 2015-08-26 07:18:33 20 2
19 2015-08-26 07:18:53 4 3
20 2015-08-26 07:19:14 5 4