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

时间:2018-12-14 13:46:16

标签: r data.table self-reference cumsum

我有一个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

有人对这个问题有想法吗?

3 个答案:

答案 0 :(得分:4)

我们可以将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

答案 1 :(得分:2)

基本的R解决方案:

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

答案 2 :(得分:1)

这是一个函数,该函数花费您希望向量多长时间并生成该长度的向量:

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