2017-09-15 2 views
0

Rに同じサイズの行列を含むリストがあります。すべての行列の同じ要素に関数を適用したいと思います。例:リストのすべての要素のすべての要素に関数を適用する方法R

> a <- matrix(1:4, ncol = 2) 
> b <- matrix(5:8, ncol = 2) 
> c <- list(a,b) 
> c 
[[1]] 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

[[2]] 
    [,1] [,2] 
[1,] 5 7 
[2,] 6 8 

は、今私は平均関数を適用すると、そのような行列を取得したいと思います:これを行うには

 [,1] [,2] 
[1,] 3 5 
[2,] 4 6 
+0

この簡単な例では、 'd =(a + b)/ 2'を試してみると、目的の行列が返されます。 –

答えて

5

一つの概念の方法は、行列を合計することで、次に取るだろう各エントリの平均値。 Reduceを使用してみてください:

Reduce('+', c)/length(c) 

出力:ここ

 [,1] [,2] 
[1,] 3 5 
[2,] 4 6 

デモ:

Rextester

+0

ありがとう、素晴らしい作品! –

0

別のオプションは、アレイを構築し、その後applyを使用することです。

ステップ1:アレイを構築する。
abindライブラリを使用して とdo.call、あなたがこれを行うことができます:基本Rを使用して

library(abind) 
myArray <- do.call(function(...) abind(..., along=3), c) 

を、あなたが構造を取り除くし、このようにそれを再構築することができます両方の場合において

myArray <- array(unlist(c), dim=c(dim(a), length(c))) 

、これらは所望の配列を返す。

, , 1 

    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

, , 2 

    [,1] [,2] 
[1,] 5 7 
[2,] 6 8 

ステップ2 :applyを使用して、第1および第2の次元に沿った平均を計算する。

apply(myArray, 1:2, mean) 
    [,1] [,2] 
[1,] 3 5 
[2,] 4 6 

あなたはもっと多くの機能を入れ替えることができますので、これは、Reduceより柔軟になりますが、それは、この特定の用途のために遅くなります。

関連する問題