web-dev-qa-db-ja.com

リストの要素を名前で削除する

私は長い名前のリストを使用していて、特定の名前に一致する要素を、次のような整頓されたコンテキスト内で保持/削除しようとしています。

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
9
kputschko

それを完全に整頓しておくと、あなたはできる、

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

名前で削除するには、次を使用できます。

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"
4
Tom Greenwood

ベースRを使用:

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

$c
[1] "zxcvb"
2
Onyambu

前の回答と同様ですが、OPのように名前を検索します

within(a_list, rm(a))

# or

a_list[!grepl("a",names(a_list))]

# or

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

# or

a_list[-which(names(a_list)=="a")]
2
Ferroao