如何将使用 enquo() 创建的动态变量名称传递给 dplyr 的 mutate 以进行评估?
How do I pass a dynamic variable name created using enquo() to dplyr's mutate for evaluation?
我正在创建一个工作流,其中包含相同的重命名管道步骤,select通过,然后使用我在管道之前提供的名称对所有管道进行变异。
我已成功使用 enquo()
和 !!
(bang bang) 重命名为我想要的字符串,然后再次 select,但是当我到达 mutate 步骤时,它要么重复文本字符串作为列值,否则将不计算。
我重新创建了以下代码:
#Testing rename, select, and mutate use cases for enquo()
#Load packages
library(dplyr)
library(rlang)
library(magrittr)
#Create name I want to pass
new_var <- quo("new_name")
#Create Test Data
t1 <- tibble(Year = c(2000:2004),
old_name = c(NA, 1, 1, 1, NA))
我可以用 quo_name()
和 :=
重命名该列
t1 %>%
rename( !! quo_name(new_var) := old_name)
我可以 select 使用 !!
t1 %>%
rename( !! quo_name(new_var) := old_name) %>%
select(Year, !!new_var)
但我无法在 mutate 中调用该列并使用这些值
t1 %>%
rename( !! quo_name(new_var) := old_name) %>%
select(Year, !!new_var) %>%
mutate(test_var = (!! new_var))
尝试将第一行替换为:
new_var <- sym("new_name")
在这种情况下,您现有的代码应该 运行,但您也可以简化它,例如:
t1 %>%
rename( !! new_var := old_name) %>%
select(Year, !! new_var) %>%
mutate(test_var = (!! new_var))
'new_var' 对象是字符串上的 quosure
。提取字符串,将其转换为符号,然后进行评估
t1 %>%
rename( !! quo_name(new_var) := old_name) %>%
select(Year, !!new_var) %>%
mutate(testvar = !! rlang::sym(rlang::quo_name(new_var)))
# A tibble: 5 x 3
# Year new_name testvar
# <int> <dbl> <dbl>
#1 2000 NA NA
#2 2001 1 1
#3 2002 1 1
#4 2003 1 1
#5 2004 NA NA
此外,如果我们从 quosure
中不加引号的 new_var
开始,则 OP 的代码有效
new_var = quo(new_name)
t1 %>%
rename(!! new_var := old_name) %>%
select(Year, !!new_var) %>%
mutate(testvar = !! new_var)
# A tibble: 5 x 3
# Year new_name testvar
# <int> <dbl> <dbl>
#1 2000 NA NA
#2 2001 1 1
#3 2002 1 1
#4 2003 1 1
#5 2004 NA NA
我正在创建一个工作流,其中包含相同的重命名管道步骤,select通过,然后使用我在管道之前提供的名称对所有管道进行变异。
我已成功使用 enquo()
和 !!
(bang bang) 重命名为我想要的字符串,然后再次 select,但是当我到达 mutate 步骤时,它要么重复文本字符串作为列值,否则将不计算。
我重新创建了以下代码:
#Testing rename, select, and mutate use cases for enquo()
#Load packages
library(dplyr)
library(rlang)
library(magrittr)
#Create name I want to pass
new_var <- quo("new_name")
#Create Test Data
t1 <- tibble(Year = c(2000:2004),
old_name = c(NA, 1, 1, 1, NA))
我可以用 quo_name()
和 :=
t1 %>%
rename( !! quo_name(new_var) := old_name)
我可以 select 使用 !!
t1 %>%
rename( !! quo_name(new_var) := old_name) %>%
select(Year, !!new_var)
但我无法在 mutate 中调用该列并使用这些值
t1 %>%
rename( !! quo_name(new_var) := old_name) %>%
select(Year, !!new_var) %>%
mutate(test_var = (!! new_var))
尝试将第一行替换为:
new_var <- sym("new_name")
在这种情况下,您现有的代码应该 运行,但您也可以简化它,例如:
t1 %>%
rename( !! new_var := old_name) %>%
select(Year, !! new_var) %>%
mutate(test_var = (!! new_var))
'new_var' 对象是字符串上的 quosure
。提取字符串,将其转换为符号,然后进行评估
t1 %>%
rename( !! quo_name(new_var) := old_name) %>%
select(Year, !!new_var) %>%
mutate(testvar = !! rlang::sym(rlang::quo_name(new_var)))
# A tibble: 5 x 3
# Year new_name testvar
# <int> <dbl> <dbl>
#1 2000 NA NA
#2 2001 1 1
#3 2002 1 1
#4 2003 1 1
#5 2004 NA NA
此外,如果我们从 quosure
中不加引号的 new_var
开始,则 OP 的代码有效
new_var = quo(new_name)
t1 %>%
rename(!! new_var := old_name) %>%
select(Year, !!new_var) %>%
mutate(testvar = !! new_var)
# A tibble: 5 x 3
# Year new_name testvar
# <int> <dbl> <dbl>
#1 2000 NA NA
#2 2001 1 1
#3 2002 1 1
#4 2003 1 1
#5 2004 NA NA