2012-05-10 14 views
2

行列のリストをRで作成しました。リスト内のすべての行列で、特定のインデックスの行列要素の集合を「取り出す」ことができます。私はコロン演算子が私にこれを1行で実装できると考えていました。例えば、ここでリスト内のすべての行列の[1,1]の要素にアクセスしようとする試みです。「寸法の不正確な数」行列のリストのRコロン演算子

myList = list() #list of matrices 
myList[[1]] = matrix(1:9, nrow=3, ncol=3, byrow=TRUE) #arbitrary data 
myList[[2]] = matrix(2:10, nrow=3, ncol=3, byrow=TRUE) 

#I expected the following line to output myList[[1]][1,1], myList[[2]][1,1] 
slice = myList[[1:2]][1,1] #prints error: "incorrect number of dimensions" 

上記のコードの最後の行は、エラーをスロー

参考のため、ここでの作業です(あまりエレガント)私は何をしようとしているの実装:

#assume myList has already been created (see the code snippet above) 
slice = c() 
for(x in 1:2) { 
    slice = c(slice, myList[[x]][1,1]) 
} 
#this works. slice = [1 2] 

は、1行に上記の操作を行う方法を誰もが知っていますか?

私の「マトリックスのリスト」は何か他のものに置き換えることができます。誰かが上記の操作を実行できる代替の「行列の集まり」データ構造を提案できれば、これは解決されます。

おそらく、この質問は愚かです...私は本当にクリーンな1行の実装をしたいと思います。

答えて

4

2つのもの。まず、[[[の違い。 ?'['から関連する文:

の間の最も重要な違い[、[[および$は他の2つは、単一の 要素を選択するのに対し、[ つ以上の要素を選択することができるということです。

だからおそらくmyList[1:2]とします。第二に、記述した方法でサブセット化操作を組み合わせることはできません。 myList[1:2]を実行すると、2つの行列のリストが得られます。リストには通常次元が1つしかないので、myList[1:2][1,1]を実行することはあなたにとっては無意味です。 (例外のコメントを参照してください)

lapplyの代わりにlapply(myList,'[',1,1)を試してみることもできます。

+0

...インデックスと抽出要素が容易になるだろう。例えば'foo < - list(1,2,3,4); dim(foo)< - c(2,2); foo [1,2]; foo [[1,2]]'です。場合によってはこれが便利な場合もあります。 –

+0

@SachaEpskamp良いキャッチ、私は明確にするために編集します。 – joran

+0

'myList [1:2] [1,1]'はまだ無意味ですが、 'myList [1:2]'は1次元だけのリストを返します。 –

2

これは動作します:

> sapply(myList,"[",1,1) 
[1] 1 2 

編集:ああ、申し訳ありませんが、私は以前の回答の終わりに向かって、ほぼ同じ考えを参照してください。とにかくサプリはおそらくあなたが望むものに近づくでしょう

4

あなたの行列がすべて同じ次元を持つならば、それらを3次元配列に格納することができます。あなたがリストに(暗く `とのより多くの次元を与えることができます)`:それは確かに

## One way to get your data into an array 
a <- array(c(myList[[1]], myList[[2]]), dim=c(3,3,2)) 

## Extract the slice containing the upper left element of each matrix 
a[1,1,] 
# [1] 1 2 
「リストには、一次元のみを持っている」とは全く問題とは無関係な、しかし応答で