2

R で行列のリストを作成しました。リスト内のすべての行列で、特定のインデックスの行列要素のコレクションを「引き出し」たいと思います。コロン演算子を使用すると、これを 1 行で実装できるのではないかと考えていました。たとえば、リスト内のすべての行列の [1,1] 要素にアクセスしようとすると、次のようになります。

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

3 に答える 3

4

2つのこと。[まず、との違い[[。からの関連文?'[':

[、[[、$ の最も重要な違いは、[ は複数の要素を選択できるのに対し、他の 2 つは単一の要素を選択できることです。

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

lapply代わりに試してみてください: lapply(myList,'[',1,1).

于 2012-05-10T03:12:47.083 に答える
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
于 2012-05-10T06:50:59.120 に答える
2

これは機能します:

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

編集:ああ、申し訳ありませんが、以前の回答の終わりに向かってほぼ同じ考えが見えます。とにかく、sapplyはおそらくあなたが望むものに近づくでしょう

于 2012-05-10T04:14:19.433 に答える