【问题标题】:Select a column from a list of matrices using a list of vectors使用向量列表从矩阵列表中选择一列
【发布时间】:2019-09-04 21:46:46
【问题描述】:

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

我尝试了不同的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

【问题讨论】:

    标签: r list matrix vector subset


    【解决方案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 的有用评论。

    【讨论】:

    • 完美!如果我理解正确,您正在为listOfColumns[idx] 中的列选择所有行1:nrow(x)。一旦你看到它完成,它就会变得非常有意义。 :)
    • @markus - 您无需明确指定行和列 - 只需 x[,cols] 即可。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多