我有一个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
有人对这个问题有想法吗?
答案 0 :(得分:4)
我们可以将Reduce
与accumulate = 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