我有一个尺寸相同的矩阵列表,例如:
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
答案 0 :(得分:3)
一种可能的方法是mapply('[', mat.list, TRUE, idx.vec)
。诀窍是使用'['
进行子集化,使用TRUE
作为参数来选择所有行。以下是它的工作原理:
'['(matrix(1:4, ncol = 2), TRUE, 2)
# [1] 3 4
答案 1 :(得分:3)
另一种(丑陋的)方法是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