迭代 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
}
我们可以使用 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
这是一个函数,它计算您希望向量的长度并生成该长度的向量:
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
我有一个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
}
我们可以使用 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
这是一个函数,它计算您希望向量的长度并生成该长度的向量:
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