早上好,
我相信有一种简单的方法可以做到这一点(事实上,我记得过去做过,但我不记得是怎么做的(。
我在数据帧中有一个逻辑变量,它由连续的TRUE和FALSE值组成:
dput(vel)
c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE,
TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE)
我想得到的是一个新的向量,长度相同,每次有FALSE值时,用0代替,每次有一个或多个连续的TRUE值时,重复地用连续TRUE值的数量代替。
从上面的例子中,这就是我想要获得的:
> vel.con
[1] 0 0 0 2 2 0 5 5 5 5 5 0 0 0 0 0 0 0 0 15 15 15 15 15
[25] 15 15 15 15 15 15 15 15 15 15
我已经找到了其他方法来解决这个问题,但没有重复值(例如,5,5,5,5(,而不是创建计数(例如,1,2,3,4,5(。我想要的是前者。
事先非常感谢您的帮助!
您可以在此处使用rle
和rep
tmp <- rle(x)
with(tmp, rep(lengths * values, lengths))
# [1] 0 0 0 2 2 0 5 5 5 5 5 0 0 0 0 0 0 0 0 15
# [21] 15 15 15 15 15 15 15 15 15 15 15 15 15 15
何处
x <- c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE,
TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE)
只是@markus答案的替代方案,使用data.table
data.table(x)[,v:=.N, rleid(x)][!x,v:=0][,v]
输出:
[1] 0 0 0 2 2 0 5 5 5 5 5 0 0 0 0 0 0 0 0 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15