类似的问题已被提出,我一直试图将各种答案(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)
基础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)
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)
也许有点难看,但这里我们用来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)
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |