#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