2013-04-19 15 views
18

行列のリスト(すべて同じ列数)を持っているとします。これらの行列を行( '行バインド'、rbind)ごとに追加/結合すると、単一の行列が得られますか?行列のリストを行ごとに1つの行列に結合する

サンプル:

> rbind(m1, m2) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
[3,] 2 2 2 
[4,] 2 2 2 
[5,] 2 2 2 

l <- list(m1, m2) 

私のような何かを達成したいと思います:

> matrix(1, nrow=2, ncol=3) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
> matrix(2, nrow=3, ncol=3) 
    [,1] [,2] [,3] 
[1,] 2 2 2 
[2,] 2 2 2 
[3,] 2 2 2 
> m1 <- matrix(1, nrow=2, ncol=3) 
> m2 <- matrix(2, nrow=3, ncol=3) 

今、我々は我々が2つだけあるとしましょう、リスト内の多くの行列を持つことができます

私は2つの行列で簡単にそれを行うことができますが、行列のリストを使って行う方法はわかりません。

答えて

39

使用do.call(rbind,...)

> m1 <- matrix(1, nrow=2, ncol=3) 
> m2 <- matrix(2, nrow=3, ncol=3) 
> l <- list(m1, m2) 
> do.call(rbind, l) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
[3,] 2 2 2 
[4,] 2 2 2 
[5,] 2 2 2 

あなたはまた、また、あなたが必要な場合NAで埋め、異なる列の行列をバインドできるようになる「plyr」パッケージからrbind.fill.matrix()機能に興味があるかもしれません。

Reduce(...)を使用して
> m1 <- matrix(1, nrow=2, ncol=3) 
> m2 <- matrix(2, nrow=3, ncol=4) 
> l <- list(m1, m2) 
> library(plyr) 
> rbind.fill.matrix(l) 
    1 2 3 4 
[1,] 1 1 1 NA 
[2,] 1 1 1 NA 
[3,] 2 2 2 2 
[4,] 2 2 2 2 
[5,] 2 2 2 2 
+0

なぜ 'do.call(rbind、l)'は 'rbind(l)'と異なっていますか? – clemlaflemme

+3

@clemlaflemme、rbindの最初の引数は '...'です。これは内部的に入力の 'list'に変換されます。既に 'list'を持っているので、' do.call'が出現する部分を個別に扱う必要があります。 'rbind'を直接使用したいのであれば、代わりに' rbind(l [[1]]、l [[2]]) 'のようなことをしなければなりません。 – A5C1D2H2I1M1N2O1R2T1

+0

@ A5C1D2H2I1M1N2O1R2T1、行列の次元が異なる場合はどうすればいいですか?そして、NAsをフィラーとして追加したいのですが? –

8

Antotherオプションが、私は別のオプションdo.call

m1 <- matrix(1, nrow=2, ncol=3) 
m2 <- matrix(2, nrow=3, ncol=3) 
l <- list(m1, m2) 
Reduce(rbind, l) 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 1 1 1 
[3,] 2 2 2 
[4,] 2 2 2 
[5,] 2 2 2 

よりも効率だと思う、あなたはdata.frameなくmatrixを持っている場合は、data.tableパッケージからrbindlistを使用することです。ここで私はそれを呼び出す前にdata.frameに変換します:

rbindlist(lapply(l,as.data.frame)) 
    V1 V2 V3 
1: 1 1 1 
2: 1 1 1 
3: 2 2 2 
4: 2 2 2 
5: 2 2 2 
関連する問題