35

假设我有一个矩阵列表(所有矩阵的列数都相同)。我将如何按行附加/组合这些矩阵('行绑定',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)

现在我们可以在一个列表中有很多矩阵,假设我们只有两个:

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

另一个选项 using 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

Another option, if you have data.frame and not matrix , is to use rbindlist from data.table package. Here I convert to data.frame before calling it:

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 回答