在r中使用先前计算的行值。续

时间:2015-10-28 14:40:38

标签: r data.table lag

我有一个看起来像这样的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

对此有何想法?

2 个答案:

答案 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)]