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

movingAveragesは TTR lib で利用可能なものと、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

これは何をしますか:

  • データをマトリックスに変換する
  • 列の意味を取る

これはベクトルに対する単一の操作であるため(行列自体がベクトルです)、これは非常に高速である必要があります。たとえば、1,000万要素のベクトルの場合:

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 に答える