【问题标题】:Cumulatively count how many times a condition has ocurred in a row累计计算一个条件连续发生了多少次
【发布时间】:2017-03-30 10:37:35
【问题描述】:

data.table(或data.frame)中,我如何“累计”地计算这种情况连续发生了多少次?

为了说明,

DT <- data.table(A=c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                 B=c(1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1))

如果我想添加一列 C 来表示

  • 如果 (A==B),则将当前行上方的值加 1。

  • 如果 (A!=B),从 0 重新开始

所以答案是

DT <- data.table(A=c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                 B=c(1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1),
                 C=c(1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4, 0, 1)]

这似乎很简单,但我似乎做不到。我猜它可以建立在这样的基础上?

DT[,C:=ifelse(A==B, ??, 0)]

另外,我担心这可能是一个重复的问题,但找不到它。

【问题讨论】:

    标签: r dataframe data.table cumsum


    【解决方案1】:

    我们可以使用rleid 在“B”上创建一个分组变量,然后将行序列与“B”相乘以创建“C”

    DT[, C := seq_len(.N)*B, .(A, rleid(B))]
    DT
    #    A B C
    # 1: 1 1 1
    # 2: 1 0 0
    # 3: 1 1 1
    # 4: 1 1 2
    # 5: 1 0 0
    # 6: 1 1 1
    # 7: 1 1 2
    # 8: 1 1 3
    # 9: 1 0 0
    #10: 1 1 1
    #11: 1 1 2
    #12: 1 1 3
    #13: 1 1 4
    #14: 1 0 0
    #15: 1 1 1
    

    【讨论】:

      【解决方案2】:

      base R 中使用ave

      x <- with(dt, A==B)
      cbind(dt, C = ave(x, cumsum(x == 0), FUN = cumsum))
      
         # A B C
       # 1: 1 1 1
       # 2: 1 0 0
       # 3: 1 1 1
       # 4: 1 1 2
       # 5: 1 0 0
       # 6: 1 1 1
       # 7: 1 1 2
       # 8: 1 1 3
       # 9: 1 0 0
      # 10: 1 1 1
      # 11: 1 1 2
      # 12: 1 1 3
      # 13: 1 1 4
      # 14: 1 0 0
      # 15: 1 1 1
      

      【讨论】:

        猜你喜欢
        • 2022-12-10
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多