【问题标题】:Subset nested list based on element name in R基于R中元素名称的子集嵌套列表
【发布时间】:2022-02-04 07:21:37
【问题描述】:

我有 3 个列表,分别称为 T1、T2 和 T3(如下所示)。从这些列表中,我想提取一个子集Q

L1<-list("A"=matrix(c(1:4),2),"B"=matrix(c("a","b","c","d"),2))
L2<-list("P"=matrix(c(5:8),2),"Q"=list(list("u","v","w","x"),2))

T1 <- list(L1, L2)
T2 <- list(NULL, L1, L2)
T3 <- list(L1, NULL, L2)

我需要的输出只是嵌入在父列表(T1、T2 和 T3)中的列表 Q

这是我尝试过的解决方案,但它们都为 Q 的兄弟姐妹返回 NULL 值 -

lapply(T3, `[[`, "Q")
purrr::map(T3, `[`, "Q")
purrr::map_depth(T3, 2, "Q")

请为父 T1、T2 和 T3 中的子集 Q 提出解决方案。正如您所看到的,Q 在每个父级中的位置不同,我正在寻找一种通过子名称Q 对父级列表进行子集化的解决方案,而不是对Q 的位置进行硬编码。

【问题讨论】:

  • 那么所需输出的具体形状是什么?如果两个列表包含 Q 会发生什么?
  • 永远不会发生L1L2 都包含Q。所需的输出是一个列表Q
  • 更一般情况的可能重复:stackoverflow.com/questions/58400176/…
  • 由于我的子对象是一个列表,您的解决方案似乎更合适。谢谢弗利克先生!

标签: r list subset


【解决方案1】:

你可以用recursive = FALSEunlist父列表,得到一个合并列表。然后您可以访问Q 为:

unlist(T1, recursive = FALSE)$Q
unlist(T2, recursive = FALSE)$Q
unlist(T3, recursive = FALSE)$Q

【讨论】:

    【解决方案2】:

    没有可以做到这一点的基本函数。通常,当您映射/应用列表时,您希望保留输入的长度。您可以编写一个仅返回第一个匹配项的辅助函数

    first_match <- function(x, name) {
      for (list in x) {
        if (name %in% names(list)) {
          return(list[[name]])
        }
      }
      return(NULL)
    }
    
    first_match(T1, "Q")
    first_match(T2, "Q")
    first_match(T3, "Q")
    

    【讨论】:

      【解决方案3】:

      使用外部包,这也可以通过rrapply() 中的rrapply-package 来完成:

      library(rrapply)
      
      Q1 <- rrapply(T1, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
      Q2 <- rrapply(T2, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
      Q3 <- rrapply(T3, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
      
      str(Q1)
      #> List of 1
      #>  $ Q:List of 2
      #>   ..$ :List of 4
      #>   .. ..$ : chr "u"
      #>   .. ..$ : chr "v"
      #>   .. ..$ : chr "w"
      #>   .. ..$ : chr "x"
      #>   ..$ : num 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多