Reputation: 806
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
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
Reputation: 518
I know this is old, but one simple way to do this :
a_list[['a']] <- NULL
Upvotes: 16
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
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
Reputation: 79208
using base R:
a_list[!grepl("a",unlist(a_list))]
$b
[1] "qwerty"
$c
[1] "zxcvb"
Upvotes: 5
Reputation: 173547
Keeping it full tidyverse, you could do,
purrr::discard(a_list,.p = ~stringr::str_detect(.x,"a"))
Upvotes: 14