按行名过滤矩阵的嵌套列表

Posted

技术标签:

【中文标题】按行名过滤矩阵的嵌套列表【英文标题】:Filter nested list of matrix by row name 【发布时间】:2021-12-27 00:35:05 【问题描述】:

我有一个矩阵列表,该列表已被网络抓取。我希望按行名和列名过滤每个矩阵。我可以按行名和列表过滤矩阵,但不能按列表中的矩阵!

一些数据

set.seed(1)

a_matrix  <-  matrix(sample(0:100, 16), ncol=4)
b_matrix <- matrix(sample(0:100, 16), ncol=4)
dimnames(a_matrix) <- list(rownames(a_matrix, do.NULL = FALSE, prefix = "row"),
                          colnames(a_matrix, do.NULL = FALSE, prefix = "col"))

dimnames(b_matrix) <- list(rownames(b_matrix, do.NULL = FALSE, prefix = "row"),
                           colnames(b_matrix, do.NULL = FALSE, prefix = "col"))
a_matrix
      col1 col2 col3 col4
row1   26   19   58   61
row2   37   86    5   33
row3   56   97   18   66
row4   89   62   15   42

b_matrix
      col1 col2 col3 col4
row1   13   21   86   12
row2    1   77   93   39
row3   44   64   74   47
row4   17   69   80   22

my_list <- list(a_matrix,b_matrix)


Filtering the whole list by:
 
names <- c("col1", "col2", "row2", "row3")

理想结果

a_matrix
      col1 col2  
row2   37   86   
row3   56   97   


b_matrix
      col1 col2 
row2    1   77   
row3   44   64  

虽然仍保留在列表中。

【问题讨论】:

试试lapply(my_list, \(x) x[names[3:4], names[1:2]]) 您的代码不起作用,rmatrix 是什么?并且在涉及随机过程时始终使用set.seed(),以使结果可重现。 【参考方案1】:

使用lapply 循环遍历list,使用names 向量中的行/列名称对矩阵进行子集化,其中元素3 到4 是行名属性,1 到2 是列名

lapply(my_list, \(x) x[names[3:4], names[1:2]])

-输出

[[1]]
     col1 col2
row2   37   86
row3   56   97

[[2]]
     col1 col2
row2    1   77
row3   44   64

数据

my_list <- list(structure(c(26L, 37L, 56L, 89L, 19L, 86L, 97L, 62L, 58L, 
5L, 18L, 15L, 61L, 33L, 66L, 42L), .Dim = c(4L, 4L), .Dimnames = list(
    c("row1", "row2", "row3", "row4"), c("col1", "col2", "col3", 
    "col4"))), structure(c(13L, 1L, 44L, 17L, 21L, 77L, 64L, 
69L, 86L, 93L, 74L, 80L, 12L, 39L, 47L, 22L), .Dim = c(4L, 4L
), .Dimnames = list(c("row1", "row2", "row3", "row4"), c("col1", 
"col2", "col3", "col4"))))

【讨论】:

谢谢,不太理解代码的 [3:4] 和 [1:2] 元素,但它可以按我的意愿工作! @TDaw 只是您创建了 names 向量,其中行名位于第 3 和第 4 位,而列名位于向量中的第 1 和第 2 位 再次感谢!我现在明白了

以上是关于按行名过滤矩阵的嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章

过滤0的嵌套列表

如何使用映射或过滤器而不是列表推导过滤特定值的嵌套字典(pythonic 方式)?

CSharp使用另一个列表及其嵌套列表过滤带有LINQ查询的列表

jq streaming - 过滤嵌套列表并保留全局结构

按行名合并 R 中超过 2 个数据框

如何使用linq c#优化嵌套循环并从另一个列表中过滤