【问题标题】:Extract records from a list only if they have a matching element name仅当它们具有匹配的元素名称时才从列表中提取记录
【发布时间】:2023-03-15 19:24:01
【问题描述】:

如果我有一个完全不可预测且看似荒谬的嵌套列表,如下所示:

weird_nested_structure <- (list(
  Record = "First Record",
    Pets = list(Rabbit = "True", 
                Gerbil = "True"),
  Record = "Second Record",
    Pets = list(Pets2 = list(Rabbit = "True")),
  Record = "Third Record",
    Rabbit = list(Rabbit = "True"),
  Record = "Fourth Record",
    Pets = list(Dog = "True")))

如何只提取包含名为“Rabbit”的元素的记录?

这将返回记录 1、2 和 3,但不是 4,因为记录 4 中的唯一元素名为“Pets”和“Dog”

为了清楚起见,我想将此列表过滤到仅包含名为“Rabbit”的名称/变量的记录,而不管此变量恰好位于哪个嵌套级别。因此,理想的解决方案将返回一个列表记录 1、2 和 3,但不是上述嵌套列表中的 4。

这在 R 中可能吗?

【问题讨论】:

    标签: r list dplyr purrr


    【解决方案1】:

    基本 R 中的一种方法是编写一个递归函数,如果列表中的 any 名称包含名称 "Rabbit",则该函数检查每个级别的名称

    recursive_fun <- function(x) {
      if (any(names(x) == "Rabbit"))
          return(TRUE)
      if (is.list(x))
          recursive_fun(unlist(x, recursive = FALSE))
      else 
          return(FALSE)
    }
    

    然后使用sapply 将其传递给每个列表并将返回TRUE 的列表作为子集

    weird_nested_structure[sapply(weird_nested_structure, recursive_fun)]
    

    【讨论】:

    • 感谢您的建议-在上述结构上,此方法实现了输出:“Record Pets Record Pets Record Rabbit Record Pets FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE” - 有没有办法返回相同的列表,但简化为仅包含名为“Rabbit”的列表元素(或嵌套列表元素)的记录?
    • @DavideLorino 是的,您需要对其进行子集化。我稍后对其进行了编辑,请检查更新的答案。做weird_nested_structure[sapply(weird_nested_structure, recursive_fun)]
    • 非常感谢!最后一个问题(额外的信用;))是否有一种方法可以返回整个列表,TRUE 表示存在元素名称 == "Rabbit",FALSE 表示没有元素名称 == "Rabbit"?
    • @DavideLorino 这就是最初的sapply 电话给的,对吗?如果你需要它作为一个列表,你可以使用lapplylapply(weird_nested_structure, recursive_fun)
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多