累计统计某个条件连续发生了多少次

Cumulatively count how many times a condition has ocurred in a row

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

为了说明,

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 表示

所以答案是

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)]

另外,恐怕是重复的问题,但是看不到。

我们可以使用 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

base 中使用 ave R:

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