使用指标向量将列表转换为矩阵

时间:2018-11-26 12:45:47

标签: r list matrix

我有以下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

我想使用此列表并使用向量5x2中的信息创建一个新的v矩阵:

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

此向量是一个指示向量,具有有关如何构造此新矩阵的信息。也就是说,从列表元素a中获取第1行,从列表元素a中获取第2行,依此类推。

一个人可以通过for循环来做到这一点,但是,对于我的应用程序来说,这还不够高效,我觉得可能有一个更为优雅的解决方案。我的方法:

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

谢谢!

1 个答案:

答案 0 :(得分: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))