使用r中先前计算的行值(续)
我有一个data.table,如下所示:使用r中先前计算的行值(续),r,data.table,lag,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 对此有什么想法吗?您可以通过一点算术来实现这一点: DT$G <- mean(DT$B[1:20]) DT$G <- D
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
对此有什么想法吗?您可以通过一点算术来实现这一点:
DT$G <- mean(DT$B[1:20])
DT$G <- DT$G * cumprod(rep(2,nrow(DT)))/2
或者来自@Frank
DT$G <- cumprod(c( mean(head(DT$B,20)), rep(2,nrow(DT)-1) ))
DT$Gmycalc您的想法是什么?DT[,G:=mean(B[1:20])*2^(0:19)]
对于(未来)读者,请使用:=
语法,因为我看到它实现了我的解决方案,但它的方式不是我想要的方式。创建一个向量“2”,取2的累积积,除以2,然后乘以平均值。但我想有办法直接使用前一行,而不是像这样。但是,谢谢你的努力way@KhalidN每行计算一个值,然后回顾,然后再次重新计算将是非常低效和缓慢的。这个解决方案是完全矢量化的,我想这是最好的。@DavidArenburg是的,我可以理解它的设置有点慢,但是对于像我这样更复杂的问题,我需要这样的解决方案。我真正的问题是一个比上面提到的要复杂得多的公式。第一行的实际公式如下:DT$R[1]
DT[ , G := mean(B[1:20]) * cumprod(rep(2, .N)) / 2]
DT$G <- cumprod(c( mean(head(DT$B,20)), rep(2,nrow(DT)-1) ))
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)]