按名称删除列表的元素
Remove an element of a list by name
我正在处理一个长命名列表,我正在尝试 keep/remove 匹配特定名称的元素,在 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
让它完整整洁,你可以做到,
purrr::discard(a_list,.p = ~stringr::str_detect(.x,"a"))
使用基数 R:
a_list[!grepl("a",unlist(a_list))]
$b
[1] "qwerty"
$c
[1] "zxcvb"
要按名称删除,您可以使用:
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)
returns
$`b`
[1] "awerty"
$c
[1] "zxcvb"
但是
purrr::discard(b_list,.p = ~stringr::str_detect(.x,"a"))
returns
$`a`
[1] "bsdfg"
$c
[1] "zxcvb"
与之前的答案类似,但搜索姓名与 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
我知道这是旧的,但有一个简单的方法可以做到这一点:
a_list[['a']] <- NULL
与 相同,只是更适合 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)
我正在处理一个长命名列表,我正在尝试 keep/remove 匹配特定名称的元素,在 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
让它完整整洁,你可以做到,
purrr::discard(a_list,.p = ~stringr::str_detect(.x,"a"))
使用基数 R:
a_list[!grepl("a",unlist(a_list))]
$b
[1] "qwerty"
$c
[1] "zxcvb"
要按名称删除,您可以使用:
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)
returns
$`b`
[1] "awerty"
$c
[1] "zxcvb"
但是
purrr::discard(b_list,.p = ~stringr::str_detect(.x,"a"))
returns
$`a`
[1] "bsdfg"
$c
[1] "zxcvb"
与之前的答案类似,但搜索姓名与 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
我知道这是旧的,但有一个简单的方法可以做到这一点:
a_list[['a']] <- NULL
与 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)