在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,它指示
所以答案是
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)]而且,恐怕这是一个重复的问题,但找不到它。
发布于 2017-03-30 10:39:39
我们可以使用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发布于 2017-03-30 12:19:42
在ave R中使用base:
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 1https://stackoverflow.com/questions/43115404
复制相似问题