按日期排列的连续二进制值的迭代标记

Iterative labelling of a contiguous binary value arranged by date

我希望在 table 中生成一个列,每次状态发生变化时都会迭代。重要的是这是按日期安排的

例如取下面的输入数据

dummy_d = data.frame(date = seq.POSIXt(from = as.POSIXct("2022-02-14 09:00:00"),
                                   to=as.POSIXct("2022-02-14 09:06:00"),
                                   by = "1 min"),
                 valid = c(1,1,0,0,1,0,0))

计算出的输出应该类似于

dummy_d %>% mutate(group = c(1,1,2,2,3,4,4))

也就是说,按时间排列,每次有效从0切换到1,反之,组累加。

感谢任何帮助

此解决方案使用 data.table 包。

library(data.table)

setDT(dummy_d)

dummy_d[, group := .GRP, by = rleid(as.Date(date), valid)]

dummy_d

#                   date valid group
# 1: 2022-02-14 09:00:00     1     1
# 2: 2022-02-14 09:01:00     1     1
# 3: 2022-02-14 09:02:00     0     2
# 4: 2022-02-14 09:03:00     0     2
# 5: 2022-02-14 09:04:00     1     3
# 6: 2022-02-14 09:05:00     0     4
# 7: 2022-02-14 09:06:00     0     4

单独使用 dplyr,您可以尝试以下操作:

library(dplyr)

dummy_d %>%
  mutate(group = cumsum(valid != lag(valid, default = first(valid))) + 1)

输出

                 date valid group
1 2022-02-14 09:00:00     1     1
2 2022-02-14 09:01:00     1     1
3 2022-02-14 09:02:00     0     2
4 2022-02-14 09:03:00     0     2
5 2022-02-14 09:04:00     1     3
6 2022-02-14 09:05:00     0     4
7 2022-02-14 09:06:00     0     4