3

次の深さと温度データのマトリックス (855 行、2 列) があり、各列内の 3 行ごとの平均を取得したいと考えています。例えば:

 [1,]  -6.7 18.91
 [2,]  -5.4 18.91
 [3,]  -4.0 18.59
 [4,]  -6.7 20.37
 [5,]  -6.7 20.05
 [6,]  -2.7 20.21
 [7,]  -4.0 21.03
 [8,]  -5.4 20.70
 [9,]  -4.0 20.87
[10,]  -2.7 21.37
[11,]  -2.7 21.37
[12,]  -2.7 21.37

mean(data[1:3,1])
mean(data[4:6,1])

マトリックス全体。3行ごとの平均値のコードを手動で記述せずにこれを達成するにはどうすればよいですか? アイデアや提案は大歓迎です。

4

3 に答える 3

4

tapply使用してみてくださいapply

R > f <- rep(c(1:3), each = 3)
R > f
[1] 1 1 1 2 2 2 3 3 3
R > x <- matrix(1:27, 9, 3)
R > x
      [,1] [,2] [,3]
 [1,]    1   10   19
 [2,]    2   11   20
 [3,]    3   12   21
 [4,]    4   13   22
 [5,]    5   14   23
 [6,]    6   15   24
 [7,]    7   16   25
 [8,]    8   17   26
 [9,]    9   18   27
R > apply(x, 2, function(t) tapply(t, f, mean))
  [,1] [,2] [,3]
1    2   11   20
2    5   14   23
3    8   17   26
于 2013-02-20T18:56:29.220 に答える
1

これには「rollapply」関数が非常に気に入っています。その構文は、実行しようとしているものと非常によく一致するからです。しかし、後世のために、「plyr」パッケージを使用してこの問題にどのように対処するかについて貢献したいと思いました。

注: このすべてを 1 つのステートメントで行うこともできますが、わかりやすくするために分割しています。

ステップ 1 : 並べ替え変数を持つようにデータを設定します。

data.plyr <- data.frame(test, group=floor((1:nrow(test)-1)/3)+1)

3 つの列ごとにグループ番号を割り当てる列「グループ」を追加しました。2 つのマトリックス列は、デフォルトで「X1」と「X2」になりました。

ステップ 2 : グループごとに「colMeans」関数を実行します。

library(plyr)
ddply(data.plyr, .(group), colMeans)

この特定の質問については、「plyr」パッケージは最適ではないと思いますが、今後の参考のためにその方法に注目する価値があります。'apply' ファミリと 'rollapply' 関数は、データの連続性と一貫性があれば最適に機能します。より柔軟性が必要なアプリケーションでは、'plyr' ファミリ関数をツールボックスに含めると便利です。

于 2013-02-20T19:20:41.407 に答える