В R удалить список списка, основанного на имени

#r

#r

Вопрос:

У меня есть список списков, и я хотел бы удалить все списки с определенным именем (называемые мусором в приведенных ниже примерах данных); (предпочитаю tidyverse).

 #Example data
list1a <- c(1, 2, 3)
list2a <- c(4, 5, 6)
rubbish <- c(7, 8, 9)

list1b <- c(1, 2, 3)
rubbish <- c(4, 5, 6)
list3b <- c(7, 8, 9)

listA <- list(list1a, list2a, rubbish)
names(listA) <- c("list1a", "list2a", "rubbish")
listB <- list(list1b, rubbish, list3b)
names(listB) <- c("list1b", "rubbish", "list3b")
listAB <- list(listA, listB)
names(listAB) <- c("listA", "listB")
listAB
  

Я пытался:

 new_list <- discard(listAB, .p = ~str_detect(.x,"rubbish"))
  

Ответ №1:

Вы можете использовать map для перебора списка и discard списков, которые имеют имя как "rubbish" .

 library(purrr)
map(listAB, ~discard(.x, names(.x) == 'rubbish'))
#Some other variations
#map(listAB, ~keep(.x, names(.x) != 'rubbish'))
#map(listAB, ~.x[names(.x) != 'rubbish'])

#$listA
#$listA$list1a
#[1] 1 2 3

#$listA$list2a
#[1] 4 5 6


#$listB
#$listB$list1b
#[1] 1 2 3

#$listB$list3b
#[1] 7 8 9
  

В базовом R вы можете использовать lapply :

 lapply(listAB, function(x) x[names(x) != 'rubbish'])
  

Ответ №2:

rrapply() из rrapply package — полезный инструмент для управления вложенным списком с произвольной и неравномерной глубиной. С помощью condition аргумента вы можете задать специальный аргумент .xname для идентификации имен узлов.

 library(rrapply)

rrapply(listAB, condition = function(x, .xname) .xname != "rubbish", how = "prune")

# $listA
# $listA$list1a
# [1] 1 2 3
# 
# $listA$list2a
# [1] 4 5 6
# 
# 
# $listB
# $listB$list1b
# [1] 1 2 3
# 
# $listB$list3b
# [1] 7 8 9