如何将使用enquo()创建的动态变量名称传递给dplyr的mutate进行评估?

时间:2019-02-07 14:34:12

标签: r dplyr rlang quosure

我正在创建一个工作流,其中包含相同的管道步骤,包括重命名,选择方式,然后使用我在管道之前提供的名称进行全部变异。

我已经成功使用enquo()!!(爆炸)重命名为所需的字符串,然后再次选择它,但是当我到达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)

我可以使用!!

对其进行选择
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))

2 个答案:

答案 0 :(得分:0)

尝试将第一行替换为:

new_var <- sym("new_name")

在这种情况下,您现有的代码应该运行,但是您也可以简化它,例如:

t1 %>% 
  rename( !! new_var := old_name) %>% 
  select(Year, !! new_var) %>% 
  mutate(test_var = (!! new_var))

答案 1 :(得分:0)

“ 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

此外,如果我们以new_var中的quosure开头没有引号,则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