这是一个快速入侵,用于计算最后3行中x的平均值:
s <- data.table(x=c(.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.1))
s$avgx = NA
for(i in (4:10)) s$avgx[i] <- mean(s$x[(i-1):(i-3)])
s
x avgx
1: 0.1 NA
2: 0.2 NA
3: 0.3 NA
4: 0.4 0.2 # 0.2 is average of x in previous 3 rows
5: 0.5 0.3 # etc.
6: 0.6 0.4
7: 0.7 0.5
8: 0.8 0.6
9: 0.9 0.7
10: 0.1 0.8
此代码有效,但对于大型数据(例如,100k行,平均超过100或1000行)非常慢。
使用数据表还是数据框有快速的方法吗?
答案 0 :(得分:3)
zoo::rollmean()
完成了大部分内容,只是根据需要排列行:
> rollmean(s$x, 3, na.pad=TRUE, align="right")
[1] NA NA 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.6
> means <- rollmean(s$x, 3, na.pad=TRUE, align="right")
> c(NA, means[-length(means)])
[1] NA NA NA 0.2 0.3 0.4 0.5 0.6 0.7 0.8