R循环中满足条件时按组计数

时间:2019-07-29 23:34:05

标签: r loops group-by count

我有一个时间序列数据。当列“ 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
    }
  }


1 个答案:

答案 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