我有以下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
谢谢!
答案 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))