分别计算每个块内的连续TRUE值

Win*_*ton 7 r

类似的问题已被提出,我一直试图将各种答案(rle,cumsum等等)拼凑在一起,但它花了我几个小时,我仍然没有到达那里.

我有一个数据集,其中包含仅包含TRUE/ FALSE值的列,例如:

x <- c(FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE)
Run Code Online (Sandbox Code Playgroud)

对于每组连续TRUE值,我想计算该组中的TRUEs 数.这些FALSE值可以忽略,即我想要一个输出上面的数据,如下所示:

x2 <- c(0, 0, 1, 2, 3, 0, 1, 0, 1, 2, 0)
Run Code Online (Sandbox Code Playgroud)

989*_*989 6

基础R中的一个简单的:

ave(x, cumsum(!x), FUN = cumsum)

#[1] 0 0 1 2 3 0 1 0 1 2 0
Run Code Online (Sandbox Code Playgroud)


Hen*_*rik 5

sequence(rle(x)$lengths) * x
#[1] 0 0 1 2 3 0 1 0 1 2 0
Run Code Online (Sandbox Code Playgroud)

或者,如果您可以考虑非base(在10^6向量上大约快 20 倍)

library(data.table)
rowid(rleid(x))*x
# [1] 0 0 1 2 3 0 1 0 1 2 0
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 3

也许有点难看,但这里我们用来rle()查找 TRUE 值的运行。然后用于seq.int()对组进行索引(这也会使组为 FALSE),但我们乘以该值,以便 FALSE 索引变为 0。

x <- c(FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE)
with(rle(x), unlist(Map(`*`, sapply(lengths, seq.int), values)))
# [1] 0 0 1 2 3 0 1 0 1 2 0
Run Code Online (Sandbox Code Playgroud)