在dplyr中使用R公式

问题描述

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

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

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

不幸的是,以下操作无效:

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

我该如何使用dpylr以这种方式引用变量?我已经尝试过rlang::sym之类的几件事,但是没有任何运气。

解决方法

我们可以使用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类,我们将转换为sym bol并求值(!!


使用一个可复制的小例子

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