簡體   English   中英

如何將使用enquo()創建的動態變量名稱傳遞給dplyr的mutate進行評估?

[英]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_varquosure ,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM