Rのベクトルのリストから行列を作成するにはどうすればよいですか?


102

目標:同じ長さのベクトルのリストから、各ベクトルが行になる行列を作成します。

例:

> a <- list()
> for (i in 1:10) a[[i]] <- c(i,1:5)
> a
[[1]]
[1] 1 1 2 3 4 5

[[2]]
[1] 2 1 2 3 4 5

[[3]]
[1] 3 1 2 3 4 5

[[4]]
[1] 4 1 2 3 4 5

[[5]]
[1] 5 1 2 3 4 5

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

[[7]]
[1] 7 1 2 3 4 5

[[8]]
[1] 8 1 2 3 4 5

[[9]]
[1] 9 1 2 3 4 5

[[10]]
[1] 10  1  2  3  4  5

が欲しいです:

      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5 

回答:


124

1つのオプションは使用することdo.call()です:

 > do.call(rbind, a)
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

5
したがって、これと標準のrbind()の違いは、do.call()が各リスト項目を個別の引数として渡すことです-正しいですか?do.call(rbind、a)は、rbind(a [[1]]、a [[2]] ... a [[10]])と同等ですか?
マットパーカー、

5
do.call()はこの目的に最適です。入門資料で「文書化」されていればよかったのですが。
andrewj 2009

16

simplify2arrayかなり直感的な基本機能です。ただし、Rのデフォルトでは、最初に列ごとにデータが入力されるため、出力を転置する必要があります。(で説明されsapplyているようにsimplify2array、を使用しhelp(sapply)ます。)

> t(simplify2array(a))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

12

簡単ではありませんが、うまくいきます:

> t(sapply(a, unlist))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

1
rjson結果、colMeansこの方法だけのために働きます!ありがとうございました!
mpyw 2016年

10

組み込みmatrix関数には、データを入力するための素晴らしいオプションがありますbyrowunlistソースリストのと組み合わせると、マトリックスが得られます。行数を指定して、リストされていないデータを分割できるようにする必要もあります。あれは:

> matrix(unlist(a), byrow=TRUE, nrow=length(a) )
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

または、行列を列で埋めてから転置しますt( matrix( unlist(a), ncol=length(a) ) )
Kalin、2014

8
t(sapply(a, '[', 1:max(sapply(a, length))))

ここで、「a」はリストです。行サイズが等しくない場合に機能します


3
> library(plyr)
> as.matrix(ldply(a))
      V1 V2 V3 V4 V5 V6
 [1,]  1  1  2  3  4  5
 [2,]  2  1  2  3  4  5
 [3,]  3  1  2  3  4  5
 [4,]  4  1  2  3  4  5
 [5,]  5  1  2  3  4  5
 [6,]  6  1  2  3  4  5
 [7,]  7  1  2  3  4  5
 [8,]  8  1  2  3  4  5
 [9,]  9  1  2  3  4  5
[10,] 10  1  2  3  4  5

1
行の長さが同じでない場合、これは単に機能しませんが、do.call(rbind、...)は機能します。
rwst 2013

行方不明の行データに対してNAを使用して行サイズが等しくない場合に機能させるための手がかりはありますか?
Arihant 2014年

1
@rwst実際、do.call(rbind、...)は、最後に行を埋めるときにベクトルを再利用するつもりでない限り、長さが等しくないベクトルに対しては機能しません。NA代わりに最後に値を入力する方法については、Arihantの応答を参照してください。
カリン、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.