【问题标题】:Forcing dplyr to evaluate passed symbol / quosure when conflicting with existing column name与现有列名冲突时强制 dplyr 评估传递的符号/quosure
【发布时间】:2021-04-17 20:28:43
【问题描述】:

问题

我想以am <- "cyl" 的形式将列名字符串转换为dplyr::arrange。目的是按列cyl排序。

期望的结果

dplyr::arrange(mtcars, cyl)

尝试

am <- "cyl"

1) rlang::quo

dplyr::arrange(mtcars, !!rlang::quo(am))

am 而非cyl 排序。

2) rang::ensym

dplyr::arrange(mtcars, !!rlang::ensym(am))

am 而非cyl 排序。

3) 咖喱卷

dplyr::arrange(mtcars, {{am}})

未排序。


背景

在实际功能中,我按我正在创建的索引列对数据框进行排序。具有列名的变量称为index_column。我想保护自己免受包含index_column 的实际数据的影响,尽管这种情况极不可能发生。我可以使用make.names 并扫描唯一的列名来解决这个问题,但我对解决上述问题更感兴趣。

【问题讨论】:

    标签: r dplyr rlang tidyeval quosure


    【解决方案1】:

    应该是sym

    out2 <-  dplyr::arrange(mtcars, !!rlang::sym(am))
    

    -使用 OP 的预期测试

    out1 <- dplyr::arrange(mtcars, cyl)
    identical(out1, out2)
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      推荐的方式是使用.data:

      dplyr::arrange(mtcars, .data[[my_variable]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-17
        • 2017-01-01
        • 2019-09-23
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        相关资源
        最近更新 更多