【问题标题】:Combine a list of matrices to a single matrix by rows按行将矩阵列表组合成单个矩阵
【发布时间】:2013-04-13 04:43:48
【问题描述】:

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

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

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 个矩阵上做到这一点,但我不知道如何用一个矩阵列表来做到这一点。

【问题讨论】:

    标签: r


    【解决方案1】:

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

    您可能还对“plyr”包中的rbind.fill.matrix() 函数感兴趣,它还可以让您绑定具有不同列的矩阵,并在必要时填写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
    

    【讨论】:

    • 为什么do.call(rbind, l)rbind(l)不同?
    • @clemlaflemme,rbind 的第一个“参数”是...,它在内部被转换为输入的list。由于我们已经有一个list,我们需要单独处理每个,这就是do.call 发挥作用的地方。如果您想直接使用rbind,则必须改为使用rbind(l[[1]], l[[2]])
    • @A5C1D2H2I1M1N2O1R2T1,如果矩阵的维度不同,我们想添加 NA 作为填充符怎么办?
    • @phil_t,我想您还没有完全阅读答案....请参阅 plyr 建议。
    【解决方案2】:

    使用 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.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
    

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2018-05-31
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多