r语言 - 在dplyr公式右侧使用动态变量

  • 本文关键字:动态 变量 r语言 dplyr r dplyr
  • 更新时间 :
  • 英文 :


假设我希望重新调整iris数据集中的Species,使参考级别变为" virginica">

want_iris <- iris %>% 
mutate(Species = relevel(factor(Species), ref = "virginica")) 
want_iris$Species
...
[141] virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica 
Levels: virginica setosa versicolor

但是,假设我希望动态更改变量(Species)和参考级别(virginica)

var_name <- "Species"
ref_name <- "virginica"
test_iris <- iris %>% 
mutate({{var_name}} := relevel(factor({{var_name}}), ref = {{ref_name}})) 
test_iris$Species
Error: Problem with `mutate()` column `Species`.
i `Species = relevel(factor("Species"), ref = "virginica")`.
x 'ref' must be an existing level

从我从这些帖子(1,2)中收集到的,在dplyr的右侧使用动态变量并不是直截了当的,我实际上在3上问了一个类似的问题,尽管这个问题仅限于列名。

我的粗略猜测是,由于{{}}取消了变量名的引号,我指定的是ref = virginica而不是ref = "virginica"

我该如何处理这个问题?

这是另一个使用rlang::quo的选项:

var_name <- quo(Species)
ref_name <- "virginica"
test_iris <- iris %>% 
mutate(!!var_name := relevel(factor(!!var_name), ref = ref_name)) 

你可以使用rlang::qq_show:

查看它是如何被评估的
qq_show(mutate(!!var_name := relevel(factor(!!var_name), ref = ref_name)))
# mutate(^Species := relevel(factor(^Species), ref = ref_name))

最好使用.data

var_name <- "Species"
ref_name <- "virginica"
test_iris <- iris %>%
mutate(!!var_name := relevel(factor(.data[[var_name]]), ref = ref_name))

与产出

> levels(test_iris$Species)
[1] "virginica"  "setosa"     "versicolor"