累计统计某个条件连续发生了多少次
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
表示
如果 (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)]
另外,恐怕是重复的问题,但是看不到。
我们可以使用 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
在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
表示
如果 (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)]
另外,恐怕是重复的问题,但是看不到。
我们可以使用 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