комментарий @ akrun к cumprod
точен:
myfunc <- function(awq, rest) as.data.table(awq * t(apply(1 + rest, 1, cumprod)))
### Another row
x <- data.table(awq = c(0.1,0.2), R1 = c(0.15), R2 = c(-0.05), R3 = c(0.70), R4 = c(-0.1))
x[, myfunc(awq, .SD[,R1:R4])]
# R1 R2 R3 R4
# [1,] 0.115 0.10925 0.185725 0.1671525
# [2,] 0.230 0.21850 0.371450 0.3343050
Вы можете увеличить исходный кадр с помощью пары техник:
cbind(x, x[, myfunc(awq, .SD[,R1:R4])])
# awq R1 R2 R3 R4 R1 R2 R3 R4
# 1: 0.1 0.15 -0.05 0.7 -0.1 0.115 0.10925 0.185725 0.1671525
# 2: 0.2 0.15 -0.05 0.7 -0.1 0.230 0.21850 0.371450 0.3343050
x[, c("S1","S2","S3","S4") := myfunc(awq, .SD[,R1:R4]) ][]
# awq R1 R2 R3 R4 S1 S2 S3 S4
# 1: 0.1 0.15 -0.05 0.7 -0.1 0.115 0.10925 0.185725 0.1671525
# 2: 0.2 0.15 -0.05 0.7 -0.1 0.230 0.21850 0.371450 0.3343050
Первый имеет недостаток в виде повторяющихся имен столбцов. Последний имеет тот недостаток, что необходимо знать количество задействованных столбцов априори.
myfunc
в основном состоит из фанеры, это можно упростить дополнительно:
x[, awq*t(apply(1+.SD[,R1:R4],1,cumprod)) ]
# R1 R2 R3 R4
# [1,] 0.115 0.10925 0.185725 0.1671525
# [2,] 0.230 0.21850 0.371450 0.3343050
со всеми этапами «увеличения», о которых я упоминал ранее.