所以我想要做的是在数据帧中创建一个从1开始的序列,但是当它遇到基于另一列的TRUE时,如果它们在连续的行中,则匹配那些。
例如,在此数据集中:
df <- data.frame(date = c("11","12", "13","14","15","16","17","18","19","20","21", "22", "23"),
flag = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE))
我想将此作为输出:
df <- data.frame(date = c("11","12", "13","14","15","16","17","18","19","20","21", "22", "23"),
flag = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
id = c(1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 8, 9, 10))
请记住,按顺序排列的日期只是一个示例,因为我正在使用大数据集,因此它们根本不会协调。此外,标志列只是数据框中的一列,其中包含数十列
答案 0 :(得分:3)
以下是data.table
library(data.table)
i1 <- setDT(df)[, grp := rleid(flag)][, .I[flag & (seq_len(.N)==1)], grp]$V1
df[, flag1:= flag][i1, flag1 := FALSE][, id := cumsum(!flag1)][, c('flag1', 'grp') := NULL][]
# date flag id
# 1: 11 FALSE 1
# 2: 12 FALSE 2
# 3: 13 FALSE 3
# 4: 14 TRUE 4
# 5: 15 TRUE 4
# 6: 16 FALSE 5
# 7: 17 FALSE 6
# 8: 18 TRUE 7
# 9: 19 TRUE 7
#10: 20 TRUE 7
#11: 21 FALSE 8
#12: 22 FALSE 9
1#3: 23 FALSE 10