【问题标题】:how to drop columns by passing variable name with dplyr?如何通过使用 dplyr 传递变量名来删除列?
【发布时间】:2017-06-08 17:37:40
【问题描述】:

我有一个如下的df:

a <- data_frame(keep=c("hello", "world"),drop = c("nice", "work"))
a
Source: local data frame [2 x 2]
   keep  drop
  (chr) (chr)
1 hello  nice
2 world  work

我可以使用a %&gt;% select(-drop) 毫无问题地删除该列。但是,如果我想传递一个变量来呈现drop 列,那么它会返回错误。

name <- "drop"
a  %>% select(-(name))

-(name) 中的错误:一元运算符的参数无效

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以使用one_of 查找列位置,然后使用- 删除它,select(-one_of(name)),如果您检查?select,则使用记录在 Drop 变量中 示例部分:

    name <- "drop"
    a %>% select(-one_of(name))
    
    # A tibble: 2 × 1
    #   keep
    #  <chr>
    #1 hello
    #2 world
    

    或者使用select_,您需要将- 与列名一起粘贴以删除它们,并将粘贴的列名传递给.dots 参数,如果要删除的列不止一列:

    name <- "drop"
    a %>% select_(.dots = paste("-", name))
    
    # A tibble: 2 × 1
    #   keep
    #  <chr>
    #1 hello
    #2 world
    

    【讨论】:

    • 一个简单的问题 - 通常当列名在字符串中时,我们使用 select_() 版本对吗?当我尝试这个时,没有工作
    • select_ 不再是建议。你能更新解决方案吗?
    【解决方案2】:

    你可以简单使用

    a <- data_frame(keep=c("hello", "world"),drop = c("nice", "work"))
    select(a, -starts_with('drop'))
    #   Source: local data frame [2 x 1]
    #
    #   keep
    #   (chr)
    # 1 hello
    # 2 world
    

    您也必须搜索一些以前编写的解决方案。请在此处阅读文档Select/rename variables by name.DPLYR

    我希望这对你有用 :) @Psidomthanx 更新您的答案.. 但我也会请求支持者为我投票,因为我最近成为了活跃用户,并且仍然可以获得 stackoverflow 的基本权限。

    【讨论】:

      【解决方案3】:

      我们可以使用selectsetdiff

      a %>%
          select_(setdiff(names(.), name))
      # A tibble: 2 × 1
      #   keep
      #   <chr>
      #1 hello
      #2 world
      

      【讨论】:

        【解决方案4】:

        更多可能性:

        name <- "drop"
        a %>% `[<-`(name, value=NULL)
        a %>% magrittr::inset(name,value=NULL)
        a %>% purrr::modify_at(name,~NULL)
        

        【讨论】:

          【解决方案5】:

          我只能通过首先使用 ungroup 取消分组数据来使这些解决方案发挥作用:

          df <- df  %>%  ungroup  %>%  select(-hello)
          

          注意要删除的列名上没有引号 (hello)。此外,要删除多列,只需在 hello 之后放置 , 并添加第二列。

          【讨论】:

            【解决方案6】:

            来自?select_ 帮助:“dplyr 过去提供每个动词的双版本,后缀有下划线。......但是,dplyr 现在使用整洁的评估语义......因此,下划线版本现在是多余的。”

            vignette("programming") 中给出的例子,类似于@Psidom 的回答,是:

            name < "drop"
            a %>% select(!all_of(name))
            

            或者,这个可以创建一个删除列的函数,这样drop 就不需要引用了:

            drop_columns <- function(data, cols) {
              data %>% select(!{{cols}})
            }
            
            drop_columns(a, drop)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-05-08
              • 2015-11-21
              • 1970-01-01
              • 2019-06-05
              • 2017-01-02
              • 2015-12-13
              • 1970-01-01
              相关资源
              最近更新 更多