将一系列数字会话化为一组,一旦达到累积阈值就会重置

时间:2016-12-01 18:00:37

标签: r grouping sequence

考虑这个序列,我们可以将其视为"事件之间的时间"

x <- c(5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2)

我想把它们分成30个桶,但重置的桶。期望的结果:

output <- c(0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2)

这是因为,当我们累计达到30时,我们会重置&#34;并再次开始计算。因此,5 + 40 > 30,我们下降到零并开始累积添加,直到我们达到30 ...(3 + 6 + 0 ...),这发生在我们到达x[10] == 18时。

1 个答案:

答案 0 :(得分:3)

一种选择是使用Reduce()计算累积总和,当sum超过某个阈值时,可以将cumsum(Reduce(function(x, y) if(x < 30) x + y else y, x, acc = T) >= 30) # [1] 0 1 1 1 1 1 1 1 1 2 2 2 2 2 设置为零:

aggregate()