2017-10-17 89 views

回答

6

这里是cumsum

一个选项
i1 <- dataset <1 
tapply(dataset[!i1], cumsum(i1)[!i1], FUN = sum) 
# 1 2 3 
# 6.8 1.4 12.3 
+1

这是一个很好的! –

1

提取行程长度编码对于那些满足您的是标准条目> 1:

foo <- rle(dataset>1) 

现在我们需要来标记不同的运行。我们标签值< = 1的运行为“0”和所有那些> 1,通过增加整数:

foo$values <- as.numeric(foo$values) 
foo$values[foo$values>0] <- 1:sum(foo$values[foo$values>0]) 

我们现在backtransform这得到正确的标签。看看index明白发生了什么:

index <- inverse.rle(foo) 
cbind(dataset,index) 

我们终于由不同的指标值求和值(并忽略那些指数是0,因为这个总结是< = 1项):

by(dataset,index,sum)[-1] 

输出:

> cbind(dataset,index) 
     dataset index 
[1,]  0.5  0 
[2,]  1.2  1 
[3,]  1.5  1 
[4,]  2.1  1 
[5,]  2.0  1 
[6,]  0.8  0 
[7,]  1.4  2 
[8,]  0.0  0 
[9,]  2.4  3 
[10,]  2.9  3 
[11,]  2.9  3 
[12,]  2.7  3 
[13,]  1.4  3 
[14,] -0.8  0 
[15,] -0.4  0 
[16,] -0.2  0 

> by(dataset,index,sum)[-1] 
index 
    1 2 3 
6.8 1.4 12.3