【问题标题】:Remove an element of a list by name按名称删除列表的元素
【发布时间】:2018-07-06 04:16:56
【问题描述】:

我正在处理一个长命名列表,我正在尝试在 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

【问题讨论】:

  • 基于this question,听起来pluck[[ 的替代品,而不是[,因此没有内置的方法来完成a_list[2:3][[ 只选择one element

标签: r tidyverse


【解决方案1】:

保持完整的整洁,你可以做到,

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

【讨论】:

    【解决方案2】:

    使用基础 R:

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

    【讨论】:

      【解决方案3】:

      要按名称删除,您可以使用:

      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】:

        与之前的答案类似,但搜索名称与 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
        

        【讨论】:

          【解决方案5】:

          我知道这是旧的,但一种简单的方法可以做到这一点:

          a_list[['a']] <- NULL
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-02
            • 1970-01-01
            • 2016-10-07
            • 2016-06-22
            • 2020-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多