【问题标题】:How to generate a sequence that corresponds for True and False如何生成对应于 True 和 False 的序列
【发布时间】:2017-07-09 10:49:09
【问题描述】:

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

    这是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
    

    【讨论】:

    • 谢谢,但由于我的数据集很大并且使用数据表会大大降低速度,因此正在寻找无数据表的答案
    • @Ic3MaN911 data.table 用于大数据集,效率很高。也许您正在寻找 data.frame 解决方案(这会很慢)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多