仅当记录具有匹配的元素名称时才从列表中提取记录

时间:2019-07-04 06:35:48

标签: r list dplyr purrr

如果我有一个完全不可预测且似乎毫无意义的嵌套列表,如下所示:

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")))

如何仅提取具有名为“兔子”的元素的记录?

这将返回记录1、2和3,但不会返回不是 4,因为记录4中仅有的元素被命名为“宠物”和“狗”

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

在R中有可能吗?

1 个答案:

答案 0 :(得分: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)]