3

嗨,这是这里提出的问题的扩展: 条件累积和

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

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).

我想以矢量化的方式来做,因为我的矢量相当大。到目前为止,我一直在尝试使用 rle 来实现这一目标,但没有取得多大成功。

非常感谢。

4

2 回答 2

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

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

于 2012-07-16T13:20:31.563 回答
0

这应该有效。没有循环。非常快,因为所有工作都发生在 R 之外

sum_from<-function(value,from)
{
  i  <- cummax(seq_along(value)*from)
  cv <- cumsum(value*cummax(from))  
  cv - c(0,0,cv[-length(cv)])[i+1] 
}

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)

all(sum_from(d,d==0)==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))

结果匹配:

> all(sum_from(d,d==0)==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))
[1] TRUE
> 
于 2021-03-16T21:36:38.383 回答