Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用r中先前计算的行值(续)_R_Data.table_Lag - Fatal编程技术网

使用r中先前计算的行值(续)

使用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

我有一个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 <- DT$G * cumprod(rep(2,nrow(DT)))/2
或者来自@Frank

DT$G <- cumprod(c( mean(head(DT$B,20)), rep(2,nrow(DT)-1) ))

DT$G
mycalc您的想法是什么?
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)]