我想计算类似于滚动均值或移动平均值的东西但是没有通过滑动窗口这样做。例如,对于以下一组数字,我希望下面显示的平均数为5:
1,2,3,4,5,1,2,4,5,6,7,8,1,2,3,1,1,3,2,1
| 3 | 3.6 | 4.2 | 1.6 | //mean of every 5 numbers
我知道TTR lib中可用的movingAverages
和使用滑动窗口的rollmean
函数,所以这样做是相当简单的:
d <- c(1,2,3,4,5,1,2,4,5,6,7,8,1,2,3,1,1,3,2,1)
m <- rollmean(d,5)
m[seq(1,length(m),5)]
> [1] 3.0 3.6 4.2 1.6
但我有一个大型数据集,必须有一种更有效的方法来计算这个...任何想法?我假设有一个功能可以做到这一点,但我不能想到这种类型的平均值被称为。
答案 0 :(得分:10)
如果我理解正确,你可以这样做:
x <- c(1,2,3,4,5,1,2,4,5,6,7,8,1,2,3,1,1,3,2,1)
colMeans(matrix(x, nrow=5))
3.0 3.6 4.2 1.6
这是做什么的:
由于这是对向量的单个操作(矩阵本身就是一个向量),因此应该非常快。例如,对于1000万个元素的向量:
x <- runif(1e7)
system.time(colMeans(matrix(x, nrow=5)))
user system elapsed
0.05 0.02 0.07
答案 1 :(得分:4)
只是为了好玩,以下是tapply
tapply(x, rep(seq(length(x)/5),each=5), mean)
## 1 2 3 4
## 3.0 3.6 4.2 1.6
这很容易适用于长度不能被5整除的矢量:
x <- c(x, 2)
tapply(x, head(rep(seq(ceiling(length(x)/5)), each=5),length(x)), mean)
## 1 2 3 4 5
## 3.0 3.6 4.2 1.6 2.0