我想使用代表每个矩阵列的布尔向量列表从不同维度的矩阵列表中选择列。
我尝试了不同的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
答案 0 :(得分:1)
因为您的列表中包含您根本不想保留的矩阵,所以我们可以首先创建一个索引向量,该索引向量仅选择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提供有用的评论。