迭代 cumsum 其中 sum 确定要添加的下一个位置

iterative cumsum where sum determines the next position to be added

我有一个data.table如下

set.seed(5)
x <- data.table(x=sample(1:20,15))

> x
     x
 1:  5
 2: 14
 3: 17
 4: 20
 5:  2
 6: 11
 7:  8
 8: 15
 9: 12
10: 16
11:  3
12: 18
13: 10
14:  4
15: 13

我想从 1 开始并迭代地累加值,以便 cumsum() 的值确定要添加到总和中的下一个数字。

在示例中,我想添加 x 的第一个值,此处为 5,然后跳转到值编号 5 并添加该值,此处为 2,然后跳转到值编号 5+2=7,此处8,然后取值数5+2+8=15,这里是13。

也就是我要得到一个向量

> res
[1]  1  5  7 15

有人知道这个问题吗?

基础 R 解决方案:

i = 1
v = i
sum = 0
while (i <= nrow(x)) {
   v = c(v, i)
   sum = sum + x$x[i]
   i = sum
}

我们可以使用 Reduceaccumulate = TRUE

accum <- Reduce(function(i, j) i + x$x[i], x$x, accumulate = TRUE)
c(1, accum[!is.na(accum)])
# [1]  1  5  7 15 28

purrr::accumulate

library(purrr)

accum <- accumulate(x$x, ~ .x + x$x[.x])
c(1, accum[!is.na(accum)])
# [1]  1  5  7 15 28

这是一个函数,它计算您希望向量的长度并生成该长度的向量:

recursiveadd<-function(x, n) {k<-x$x[1]
 for (i in 1:(n-1)) {
     k[i+1]<-sum(x$x[k[i]],k[i])
   }
 k
}

recursiveadd(x,4)
[1]  5  7 15 28