35

行列のリストがあるとしましょう(すべて同じ列数です)。これらの行列を行ごとに追加/結合して ('row bind', rbind)、単一の行列を取得するにはどうすればよいですか?

サンプル:

> 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 つしかないとします。

l <- list(m1, m2)

私は次のようなことを達成したいと思います:

> 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

2 つのマトリックスで簡単に実行できますが、マトリックスのリストで実行する方法がわかりません。

4

2 に答える 2

65

使用する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

rbind.fill.matrix()「plyr」パッケージの関数にも興味があるかもしれません。これにより、マトリックスを異なる列にバインドしNA、必要に応じて入力することもできます。

> 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
于 2013-04-19T17:46:39.487 に答える
10

を使用する別のオプションReduce(...)ですが、より効率が悪いと思います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.frame に変換します。rbindlistdata.table

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
于 2013-04-19T17:48:42.010 に答える