Извлекать записи из списка, только если они имеют совпадающее имя элемента - PullRequest
0 голосов
/ 04 июля 2019

Если у меня есть список с совершенно непредсказуемым и, казалось бы, бессмысленным вложением, например:

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 Ответ

1 голос
/ 04 июля 2019

Один из способов в базе 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...