按日期排列的连续二进制值的迭代标记
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
我希望在 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