R中的条件性cumsum?

use*_*926 3 r vectorization

嗨,这是问题的延伸: 条件累积和

假设我有以下向量.我想计算零中运行的块总数.

d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);

Ans d <- c(0,0,0,1,4,8,13,12,14,17,12,20,0,0,-2,-5,-2,3,0,0,0,-1,-2,-3,-4).
Run Code Online (Sandbox Code Playgroud)

我想以矢量化方式进行,因为我的矢量相当大.到目前为止,我一直在努力使用rle来实现这一目标而没有太大的成功.

非常感谢.

Jul*_*ora 5

这将有效:

aux <- split(d, cumsum(d == 0))
v <- unlist(sapply(aux, cumsum))
1   2  31  32  33  34  35  36  37  38  39 310   4  51  52  53  54  55   6   7  81  82  83  84  85 
0   0   0   1   4   8  13  12  14  17  12  20   0   0  -2  -5  -2   3   0   0   0  -1  -2  -3  -4  
as.vector(v)
[1]  0  0  0  1  4  8 13 12 14 17 12 20  0  0 -2 -5 -2  3  0  0  0 -1 -2 -3 -4
Run Code Online (Sandbox Code Playgroud)

这里as.vector()只隐藏了元素的数量.

  • 如果在`unlist`调用中设置`use.names = FALSE`,则不需要`as.vector`.@ user1480926:你必须对非零元素组进行"cumsum",所以没有办法避免循环(显式或隐式). (2认同)