我有一个看起来像这样的data.table:
DT <- data.table(A=1:20, B=1:20*10, C=1:20*100)
DT
A B C
1: 1 10 100
2: 2 20 200
3: 3 30 300
4: 4 40 400
5: 5 50 500
...
20: 20 200 2000
我希望能够计算一个新列&#34; G&#34;将第一个值作为第B列中前20行的平均值作为第一个值,然后我想使用列G的第一行来帮助计算G的下一行值。
假设B列的前20行的平均值为105,G中下一行的公式为:DT $ G [2] = DT $ G [1] * 2,下一行又是DT $ G [3] = DT $ G [2] * 2。这意味着不应该在下一行中再次使用第一个值,依此类推。
A B C G
1: 1 10 100 105
2: 2 20 200 210
3: 3 30 300 420
4: 4 40 400 840
5: 5 50 500 1680
...
20: 20 200 2000 55050240
对此有何想法?
答案 0 :(得分:2)
你可以用一点算法来做到这一点:
DT$G <- mean(DT$B[1:20])
DT$G <- DT$G * cumprod(rep(2,nrow(DT)))/2
或使用data.table
语法,由@DavidArenburg提供:
DT[ , G := mean(B[1:20]) * cumprod(rep(2, .N)) / 2]
或来自@Frank
DT$G <- cumprod(c( mean(head(DT$B,20)), rep(2,nrow(DT)-1) ))
答案 1 :(得分:0)
mycalc <- function(x, n) {
y <- numeric(n)
y[1] <- mean(x)
for (i in 2:n) y[i] <- 2*y[i-1]
y
}
DT[ , G := mycalc(B[1:20], .N)]