按名称从列表中删除一个元素

20

我正在处理一个名称很长的列表,并尝试在tidyverse的上下文中保留/删除与特定名称匹配的元素,类似于

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

然而,我在弄清楚它方面遇到了问题。

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

3
根据这个问题,似乎pluck[[的替代品而不是[,因此没有内置的方法可以实现a_list[2:3][[只选择一个元素 - Hallie Swan
6个回答

22

按名称移除您可以使用:

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

$c
[1] "zxcvb"

我不确定其他答案所使用的是元素名称还是元素本身来进行选择。你给出的示例有点令人困惑,因为元素“a”既包含其值中的“a”,又被称为“a”。这样很容易搞混。为了展示区别,我会稍微修改一下这个示例。

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

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

返回

$`b`
[1] "awerty"

$c
[1] "zxcvb"
purrr::discard(b_list,.p = ~stringr::str_detect(.x,"a"))

返回值

$`a`
[1] "bsdfg"

$c
[1] "zxcvb"

16

我知道这已经过时了,但有一种简单的方法可以做到这一点:

a_list[['a']] <- NULL

基础代码通常是最有效率的!(就打字而言) - JebLuvsStats

15

保持完整的 tidyverse,您可以执行以下操作:

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

如果你的代码/程序包没有 stringr 作为依赖项: purrr :: discard(a_list,.p =〜grepl("a",.x)) - wibeasley

5

使用基础R:

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

$c
[1] "zxcvb"

5
与前一个答案类似,但是按照原始问题中的名称进行搜索。
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

0

Parisa的答案相同,只是更适合于tidyverse管道链:

library(magrittr)

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

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

另一种可选的表示法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接