итеративная сумма, где сумма определяет следующую позицию, которая будет добавлена - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть 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 голосов
/ 14 декабря 2018

Мы можем использовать 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
0 голосов
/ 14 декабря 2018

Вот функция, которая определяет, как долго вы хотите, чтобы ваш вектор был, и создает вектор такой длины:

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
0 голосов
/ 14 декабря 2018

Базовое решение R:

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