【问题标题】:Getting selected matrix columns from a list of matrices从矩阵列表中获取选定的矩阵列
【发布时间】:2014-02-08 05:52:28
【问题描述】:

我有一个具有相同维度的矩阵列表,例如:

mat.list=rep(list(matrix(rnorm(n=12,mean=1,sd=1), nrow = 3, ncol=4)),3)

我正在寻找一种有效的方法来从列表中的每个矩阵中检索一列,其中每个矩阵中感兴趣的列索引由向量指定。例如,对于这个列索引向量:

idx.vec=c(3,2,3)

我想从矩阵 1 中获取第 3 列,从矩阵 2 中获取第 2 列,从矩阵 3 中获取第 3 列,作为矩阵,这样矩阵的维度就是列表中矩阵的行数乘以列表中的矩阵。

对于这个例子,结果将是:

cbind(mat.list[[1]][,3],mat.list[[2]][,2],mat.list[[3]][,3])
           [,1]      [,2]       [,3]
[1,]  1.4852810  1.305448  1.4852810
[2,]  1.8647327 -1.237507  1.8647327
[3,] -0.0416013  2.156055 -0.0416013

【问题讨论】:

    标签: r list


    【解决方案1】:

    一种可能的方法是mapply('[', mat.list, TRUE, idx.vec)。诀窍是使用'[' 进行子集化,使用TRUE 作为参数来选择所有行。以下是它的工作原理:

    '['(matrix(1:4, ncol = 2), TRUE, 2)
    # [1] 3 4
    

    【讨论】:

      【解决方案2】:

      另一种(丑陋的)方法是lapply(mat.list, "[",,idx.vec)[[1]]

      > set.seed(1)
      > mat.list=rep(list(matrix(rnorm(n=12,mean=1,sd=1), nrow = 3, ncol=4)),3)
      > idx.vec=c(3,2,3)
      > lapply(mat.list, "[",,idx.vec)[[1]]
               [,1]      [,2]     [,3]
      [1,] 1.487429 2.5952808 1.487429
      [2,] 1.738325 1.3295078 1.738325
      [3,] 1.575781 0.1795316 1.575781
      

      【讨论】:

        最近更新 更多