使用向量列表从矩阵列表中选择一列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用向量列表从矩阵列表中选择一列相关的知识,希望对你有一定的参考价值。

我想使用表示每个矩阵的列的布尔向量列表从不同维度的矩阵列表中选择列。

我尝试了不同的map(s|l)apply组合,甚至经典的for循环,但我无法选择列。

使用此代码,您可以生成矩阵和布尔向量列表以进行实验:

matrices <- list(matrix(c(7,8,9,10), nrow=1), matrix(c(7,8,7,9,7,10,8,9,8,10,9,10), nrow=2), matrix(c(7,8,9,7,8,10,7,9,10,8,9,10), nrow=3))
listOfColumns <- list(c(FALSE,FALSE,FALSE,FALSE), c(FALSE,FALSE,FALSE,FALSE,FALSE,FALSE), c(TRUE,FALSE,FALSE,FALSE))

例如,使用上面的代码创建矩阵列表:

[[1]]
     [,1] [,2] [,3] [,4]
[1,]    7    8    9   10

[[2]]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    7    7    7    8    8    9
[2,]    8    9   10    9   10   10

[[3]]
     [,1] [,2] [,3] [,4]
[1,]    7    7    7    8
[2,]    8    8    9    9
[3,]    9   10   10   10

和布尔向量列表:

[[1]]
[1] FALSE FALSE FALSE FALSE

[[2]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE

[[3]]
[1]  TRUE FALSE FALSE FALSE

结果应该是包含单个元素的列表:

[[1]]
[1] 7 8 9
答案

因为你的列表包含你根本不想保留的矩阵,我们可以先创建一个索引向量,它只选择listOfColumns的列表元素,其中至少有一个TRUE

(idx <- sapply(listOfColumns, any))
# [1] FALSE FALSE  TRUE

接下来,我们使用Map对剩余的矩阵进行子集化

Map(function(x, cols) x[, cols], x = matrices[idx], cols = listOfColumns[idx])
#[[1]]
#[1] 7 8 9

感谢@thelatemail提供的有用评论。

以上是关于使用向量列表从矩阵列表中选择一列的主要内容,如果未能解决你的问题,请参考以下文章

如何将矩阵转换为R中的列向量列表?

一句python两句R:标量向量矩阵列表/字典的基本运算差异(持续更新中)

从向量列表中创建一个 2x2 矩阵列表

如何从 R 中的向量列表制作矩阵?

R语言数据结构-数据框&矩阵&列表

数字矩阵:根据列表选择列