【问题标题】:Convert list to matrix using indicator vector使用指示向量将列表转换为矩阵
【发布时间】:2018-11-26 12:45:46
【问题描述】:

我有以下5x2 矩阵列表:

l <- list(a=matrix(rnorm(10),nrow=5,ncol=2),
          b=matrix(rnorm(10),nrow=5,ncol=2),
          c=matrix(rnorm(10),nrow=5,ncol=2))

例如,此列表的第一个元素如下所示:

$a
           [,1]       [,2]
[1,] -0.4988268  1.9881333
[2,] -0.2979064  1.5921169
[3,] -1.3783522 -1.4149601
[4,]  0.2205115  0.2029210
[5,]  1.2721645  0.2861253

我想获取这个列表并使用来自向量 v 的信息创建一个新的 5x2 矩阵:

v <- c("a","a","b","c","b")

这个向量是一个指示向量,它包含关于如何构造这个新矩阵的信息。即从列表元素a 中取出第1 行,从列表元素a 中取出第2 行,以此类推。

可以通过for-loop 来实现,但是,对于我的应用程序来说,这不够高效,我觉得可能有一个更优雅的解决方案。我的做法:

goal <- matrix(nrow=5,ncol=2)
for(i in 1:length(v)){

  goal[i,] <- l[[v[i]]][i,]

}

goal
           [,1]       [,2]
[1,] -0.4988268 1.98813326
[2,] -0.2979064 1.59211686
[3,]  0.7715907 0.16776669
[4,]  0.2690278 0.02542766
[5,]  1.7865093 0.46361239

谢谢!

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    假设所有列表矩阵的行数相同,我们可以使用 mapply 并按名称 (v) 和行号对矩阵进行子集化。

    t(mapply(function(x, y) l[[x]][y, ], v, 1:nrow(l[[1]])))
    
    #        [,1]       [,2]
    #a -1.2070657  0.5060559
    #a  0.2774292 -0.5747400
    #b -0.7762539 -0.9111954
    #c  0.4595894 -0.0151383
    #b  0.9594941  2.4158352
    

    数据

    set.seed(1234)
    l <- list(a=matrix(rnorm(10),nrow=5,ncol=2),
              b=matrix(rnorm(10),nrow=5,ncol=2),
              c=matrix(rnorm(10),nrow=5,ncol=2))
    

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2014-03-09
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      相关资源
      最近更新 更多