2017-01-27 14 views
1

リストのリストから作成した行列を操作するのに問題があります。結果の行列が通常の行列のように動作しない理由を私は実際に理解していません。つまり、ベクトルを返すために列のサブセットを作成するときに、代わりにリストを取得すると思います。ここに実例があります:リストのリストから作成した行列のサブセット

x = list() 
x[[1]] = list(1, 2, 3) 
x[[2]] = list(4, 5, 6) 
x[[3]] = list(7, 8, 9) 

y = do.call(rbind, x) 
y 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 7 8 9 

yは私が期待するフォーマットです。最終的に私はこれらの行列の平均を求めたいと思いますが、この行列を部分集合化するとベクトルの代わりにリストが得られるという事実が原因です。

y[,1] 
[[1]] 
[1] 1 

[[2]] 
[1] 4 

[[3]] 
[1] 7 

これはどうして起こっているのですか? b)どのように私はこの問題を回避/解決できましたか?

ありがとうございます。

答えて

1

これは「リストのマトリックス」のもう一つの問題です。あなたには、いくつかのバックグラウンド読み取りが必要な場合は

matrix(unlist(x), nrow = length(x), byrow = TRUE) 

は、以下を参照してください:Why a row of my matrix is a listあなたは

do.call(rbind, lapply(x, unlist)) 

またはさらに簡単にする必要があります。それはあなたよりも複雑なケースです。

1

問題は、ベクトルのリストではなく、リストのリストであるためです。これは素晴らしいことではありませんが、それはうまくいくでしょう:

+0

なぜリストのリストから作られた行列がベクトルのリストと異なったものになるのでしょうか? 私が前提にしていたのは、それが行列であれば行列のように動作するということでした。おそらくマトリックスのサブタイプがあるでしょうか? – SamPassmore

0

do.callは、各リストの引数を別々に渡すので、実際には3つのリストを束縛しています。これは、要素を呼び出すときにリスト形式になっている理由を説明しています。

xを削除してから、sapplyを使用して行列を作成します。 Rはデフォルトで列を塗りつぶすので、行列を転置して目的の行列を得る必要があります。

y <- t(sapply(x, unlist)) 
関連する問題