Насколько мне известно, невозможно итеративно вычислять строки с помощью встроенных функций из data.table
. Я даже считаю, что есть дублирующийся вопрос, в котором есть похожий вопрос (хотя я не могу его найти прямо сейчас).
Однако мы можем ускорить вычисления, отметив уловки, которые мы могли бы использовать в формулировке. Сначала, чтобы получить результат в приведенном примере, мы можем отметить, что это просто cumsum(shift(A, 1, fill = 0) + shift(B, 1, fill = 0))
dt <- fread('t R A B
1 0 1 2
2 3 2 3
3 8 2 5
4 15 8 5
5 28 10 8')
dt[, R2 := cumsum(shift(A, 1, fill = 0) + shift(B, 1, fill = 0))]
dt
t R A B R2
1: 1 0 1 2 0
2: 2 3 2 3 3
3: 3 8 2 5 8
4: 4 15 8 5 15
5: 5 28 10 8 28
Однако для точно описанной проблемы R t = A t + B t + R t-1 нам нужно быть немного умнее
dt[, R3 := cumsum(A + B) - head(A + B, 1)]
dt
t R A B R2 R3
1: 1 0 1 2 0 0
2: 2 3 2 3 3 5
3: 3 8 2 5 8 12
4: 4 15 8 5 15 25
5: 5 28 10 8 28 43
Что следует из приведенного выше описания. Обратите внимание, что я удаляю первую строку, предполагая, что R<sub>0</sub> = 0
, иначе она просто станет cumsum(A + B)
Edit
Поскольку вопрос требует некоторых, возможно, более сложных ситуаций, я ' Я добавлю пример, используя более медленный (но более общий) пример. Идея здесь состоит в том, чтобы использовать функцию set
, чтобы избежать промежуточных неглубоких копий (см. help(set)
или help("datatable-optimize")
).
dt[, R4 := 0]
for(i in seq.int(2, dt[, .N])){
#dummy complicated scenario
f <- dt[seq(i), lm(A ~ B - 1)]
set(dt, i, 'R4', unname(unlist(coef(f))))
}
dt
t R A B R2 R3 R4
1: 1 0 1 2 0 0 0.0000000
2: 2 3 2 3 3 5 0.6153846
3: 3 8 2 5 8 12 0.4736842
4: 4 15 8 5 15 25 0.9206349
5: 5 28 10 8 28 43 1.0866142