kputschko
kputschko

Reputation: 806

Remove an element of a list by name

I'm working with a long named list and I'm trying to keep/remove elements that match a certain name, within a tidyverse context, similar to

dplyr::select(contains("pattern"))

However, I'm having issues figuring it out.

library(tidyverse)

a_list <- 
  list(a = "asdfg",
       b = "qwerty",
       c = "zxcvb")

a_list %>% pluck("a") # works
a_list %>% pluck(contains("a")) #does not work

a_list[2:3] # this is what I want
a_list %>% pluck(-"a") # but this does not work

Upvotes: 20

Views: 24240

Answers (6)

deeenes
deeenes

Reputation: 4576

Same as Parisa's answer, just fits better into tidyverse pipe chains:

library(magrittr)

a_list <-
    list(a = "asdfg",
         b = "qwerty",
         c = "zxcvb")

a_list %>%
magrittr::inset(c('a', 'c'), NULL)

Another alternative notation:

a_list %>%
`[<-`(c('a', 'b'), NULL)

Upvotes: 0

Parisa
Parisa

Reputation: 518

I know this is old, but one simple way to do this :

a_list[['a']] <- NULL

Upvotes: 16

Ferroao
Ferroao

Reputation: 3033

Similar to previous answer but searching names as in OP

within(a_list, rm(a))

a_list[!grepl("^a$",names(a_list))]
a_list[grepl("^a$",names(a_list))]<-NULL

a_list[-which(names(a_list)=="a")]
a_list[-which(names(a_list)!="a")]<-NULL
a_list[ which(names(a_list)=="a")]<-NULL

Upvotes: 5

Tom Greenwood
Tom Greenwood

Reputation: 1672

To remove by name you could use:

a_list %>% purrr::list_modify("a" = NULL)
$`b`
[1] "qwerty"

$c
[1] "zxcvb"

I'm not sure the other answers are using the name of the element, rather than the element itself for selection. The example you gave is slightly confusing since the element 'a' both contains 'a' in it's value AND is called 'a'. So it's easy to get mixed up. To show the difference I'll modify the example slightly.

b_list <- 
  list(a = "bsdfg",
       b = "awerty",
       c = "zxcvb")

b_list %>% purrr::list_modify("a" = NULL)

returns

$`b`
[1] "awerty"

$c
[1] "zxcvb"

but

purrr::discard(b_list,.p = ~stringr::str_detect(.x,"a"))

returns

$`a`
[1] "bsdfg"

$c
[1] "zxcvb"

Upvotes: 22

Onyambu
Onyambu

Reputation: 79208

using base R:

a_list[!grepl("a",unlist(a_list))]
$b
[1] "qwerty"

$c
[1] "zxcvb"

Upvotes: 5

joran
joran

Reputation: 173547

Keeping it full tidyverse, you could do,

purrr::discard(a_list,.p = ~stringr::str_detect(.x,"a"))

Upvotes: 14

Related Questions