[英]How do I pass a dynamic variable name created using enquo() to dplyr's mutate for evaluation?
我正在創建一個工作流,其中包含相同的管道命名,重命名,選擇,然后使用在管道之前提供的名稱進行變異的相同管道步驟。
我已經成功使用enquo()
和!!
(bang bang)重命名為我想要的字符串,然后再次選擇它,但是當我到達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))
嘗試將第一行替換為:
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
另外,如果我們在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.