如何在向量中找到连续的TRUE值,并将其替换为R中的连续TRUE值

  • 本文关键字:连续 TRUE 替换 向量 r logical-or
  • 更新时间 :
  • 英文 :


早上好,

我相信有一种简单的方法可以做到这一点(事实上,我记得过去做过,但我不记得是怎么做的(。

我在数据帧中有一个逻辑变量,它由连续的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(。我想要的是前者。

事先非常感谢您的帮助!

您可以在此处使用rlerep

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

最新更新