【问题标题】:Using R formula with dplyr将 R 公式与 dplyr 一起使用
【发布时间】:2020-09-09 09:25:59
【问题描述】:

我正在编写一个函数,它接受一个公式并使用该公式的不同元素来操作数据框。当我尝试使用dplyr 时遇到了麻烦(我认为这是因为所谓的“非标准评估”)。

例如,我想使用公式中的元素引用数据框df 中的列。如果我将公式存储为form 并希望访问以form 的第一个元素命名的df 列,我可以这样写:

df[all.vars(form)[1]].

很遗憾,以下方法不起作用:

df %>% filter(all.vars(form)[1]) < 100).

我将如何使用dpylr 以这种方式引用变量?我尝试了几种方法,例如rlang::sym,但都没有运气。

【问题讨论】:

    标签: r dataframe dplyr formula


    【解决方案1】:

    我们可以使用across,它可以是一列或多列

    library(dplyr)
    df %>%
        filter(across(all.vars(form), ~ . < 100))
    

    如果是单列

    df %>% 
         filter(across(all.vars(form)[1], ~ . < 100))
    

    或者另一个选项是rlang::sym!!

    df %>%
         filter(!! rlang::sym(all.vars(form)[1]))
    

    all.vars 的输出是 character 类,我们正在转换为 symbol 并评估 (!!)


    使用一个可重现的小例子

    data(mtcars)
    form <- mpg ~ cyl
    mtcars %>%
          filter(!! rlang::sym(all.vars(form)[1]) < 15)
    #                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
    #Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
    #Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
    #Chrysler Imperial   14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
    #Camaro Z28          13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
    

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 2017-02-22
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2017-12-29
      • 2015-03-16
      • 1970-01-01
      相关资源
      最近更新 更多