【问题标题】:dplyr: select all variables except for those contained in vectordplyr:选择除向量中包含的变量之外的所有变量
【发布时间】:2018-09-06 00:08:14
【问题描述】:

这应该是一个简单的问题,但我正在苦苦挣扎。

我有一个变量名向量,我想从数据框中排除:

df <- data.frame(matrix(rexp(50), nrow = 10, ncol = 5))
names(df) <- paste0(rep("variable_", 5), 1:5)

excluded_vars <- c("variable_1", "variable_3")

我原以为只用 - 排除 select 语句中的对象就可以了:

select(df, -excluded_vars)

但我收到以下错误:

-excluded_vars 中的错误:一元运算符的参数无效

使用select_()时也是如此

有什么想法吗?

【问题讨论】:

    标签: r select dplyr


    【解决方案1】:

    这个怎么样?需要预先构建列列表向量,并且您必须将列重命名为与其实际顺序对齐,但它可能有效吗?

    
    cc1 <- c("id")
    nm <- names(df)
    cc2 <- setdiff(nm, cc1)
    
    select(df, .cols=c(everything(), -cc1)) %>% rename_with(~ cc2)
    
    

    【讨论】:

      【解决方案2】:

      select(... -one_of()) 方法给了我一个错误

      (unused argument (-one_of(excluded_vars))

      df[, -which(names(df) %in% excluded_vars)] 为我工作(R 4.0.3)

      【讨论】:

        【解决方案3】:

        select(df, -any_of(excluded_vars)) 现在是最安全的方法(如果 excluded_vars 中包含 df 中不存在的变量名,则代码不会中断)

        【讨论】:

          【解决方案4】:

          只需简单地使用否定运算符: select(df, !c(col1, col2, col3))

          【讨论】:

          • 不适用于带引号的列名select(c("col1","col2"))。适用于未加引号的列名select(c(col1, col2)),但这不是 OP 所要求的。
          【解决方案5】:

          你可以写:

          df %>% dplyr::select(colname)
          

          有些包也有选择功能,这可能是问题所在,这就是为什么你需要提到包。

          【讨论】:

            【解决方案6】:

            作为 dplyr 的更新版本,现在可以使用以下内容:

            select(df, -excluded_vars)
            

            【讨论】:

              【解决方案7】:

              你快到了,只需在exclude_vars 中使用-c()
              像这样:

              select(df, -c(excluded_vars))
              

              【讨论】:

                【解决方案8】:

                你需要使用one_of函数:

                select(df, -one_of(excluded_vars))
                

                请参阅selectdplyr 文档中的有用函数部分,了解有关基于变量名称进行选择的更多信息。

                【讨论】:

                • 谢谢。但是为什么select(df, -excluded_vars) 会抛出错误而select(df, excluded_vars) 不会呢?
                • 来自select 的文档:“请注意,除了 :、- 和 c(),所有复杂表达式都在数据框上下文之外进行评估。”我认为这意味着- 符号在select 中使用时不会评估其参数。对one_of 的调用是评估您的论点的方法。
                【解决方案9】:

                使用select_,您可以简单地使用setdiff

                select_(df, .dots = setdiff(colnames(df), excluded_vars))
                

                【讨论】:

                • 带下划线的 dplyr 函数现在被贬低,有利于 tidyr 评估方案。
                猜你喜欢
                • 2013-11-04
                • 2018-12-09
                • 2023-03-22
                • 1970-01-01
                • 1970-01-01
                • 2020-05-25
                • 2014-10-31
                • 1970-01-01
                • 2019-02-11
                相关资源
                最近更新 更多