按行将矩阵列表组合到单个矩阵中

dat*_*eek 28 r

假设我有一个矩阵列表(所有列都相同).如何按行('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)
Run Code Online (Sandbox Code Playgroud)

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

l <- list(m1, m2)
Run Code Online (Sandbox Code Playgroud)

我希望实现以下目标:

> 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
Run Code Online (Sandbox Code Playgroud)

我可以轻松地在2个矩阵上完成它,但我不知道如何使用矩阵列表.

A5C*_*2T1 53

使用 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
Run Code Online (Sandbox Code Playgroud)

您可能还对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
Run Code Online (Sandbox Code Playgroud)

  • @clemlaflemme,`rbind`的第一个"参数"是`...`,它在内部被转换为输入的`list`.既然我们已经有了一个`list`,我们需要单独处理每一个,这就是`do.call`发挥作用的地方.如果你想直接使用`rbind`,你必须做一些像`rbind(l [[1]],l [[2]])`的事情. (3认同)

ags*_*udy 9

另一种选择使用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
Run Code Online (Sandbox Code Playgroud)

另外一个选择,如果你有data.frame和没有matrix,是rbindlistdata.table包中使用.在这里我转换为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
Run Code Online (Sandbox Code Playgroud)