3

我想计算类似于滚动平均值或移动平均值的东西,但不通过滑动窗口这样做。例如,对于以下一组数字,我希望在 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

我知道movingAveragesTTR 库中的可用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

但是我有一个大数据集,必须有一种更有效的计算方法……有什么想法吗?我假设有一个函数可以做到这一点,但我想不出这种平均值叫什么。

4

2 回答 2

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 
于 2013-01-16T15:31:21.450 回答
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 
于 2013-01-16T15:41:59.297 回答