答案 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)
以下是使用rle
和cumprod
的选项。我们使用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))