计算不同序列的累积产品

时间:2018-02-23 15:54:46

标签: r

我有以下数据表:

enter image description here`

我想为零之间的序列制作累积产品,这样我得到以下结果:

enter image description here

我需要为几个大型数据集执行此操作,并且无法找到有效的计算方法。我希望有人能够提供帮助,并提前感谢。

2 个答案:

答案 0 :(得分:3)

> y=rle(!!x)
> y$values=1:length(y$values)
> ave(x,inverse.rle(y),FUN = cumprod)
 [1]    0    0    3    3    9   36  180 1080    0    0    3   15  105

编写一个函数并将其应用于data.frame:

f=function(x){
  y=rle(!!x)#(x!=0)
  y$values=1:length(y$values)
  ave(x,inverse.rle(y),FUN = cumprod)
}

rapply(df1,f,"numeric",how="replace")
   V1   V2
1   0    0
2   1    0
3   3    3
4   6    3
5   0    9
6   0   36
7   5  180
8   5 1080
9  10    0
10  0    0

答案 1 :(得分:2)

以下是使用rlecumprod的选项。我们使用lapply遍历数据集的列,使用rle创建分组列,然后使用ave获取累积产品(cumprod

df1[] <- lapply(df1, function(x) {
           r1 <- rle(x!=0)
           ave(x, rep(seq_along(r1$values), r1$lengths), FUN = cumprod) 
         })
df1
#   V1   V2
#1   0    0
#2   1    0
#3   3    3
#4   6    3
#5   0    9
#6   0   36
#7   5  180
#8   5 1080
#9  10    0
#10  0    0

数据

df1 <- data.frame(V1 = c(0, 1, 3, 2, 0, 0, 5, 1, 2, 0),
     V2 = c(0, 0, 3, 1, 3, 4, 5, 6, 0, 0))