问题描述
我正在编写一个函数,该函数接受一个公式,并使用该公式的不同元素来操纵数据框。当我尝试使用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