如何生成对应True和False的序列

时间:2017-07-09 02:29:54

标签: r

所以我想要做的是在数据帧中创建一个从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))

请记住,按顺序排列的日期只是一个示例,因为我正在使用大数据集,因此它们根本不会协调。此外,标志列只是数据框中的一列,其中包含数十列

1 个答案:

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