假设我希望重新调整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"