首页 > 解决方案 > dplyr:如何将字符串传递给 dplyr 的 mutate 参数

问题描述

我想编写一个辅助函数,一次性总结 A、B 和 C 列的百分比变化。我想在 rlang 的帮助下将字符串传递给 dplyr 的“mutate”参数。不幸的是,我收到一条错误消息,说我有一个意外的“,”。你能看看吗?提前致谢!

library(rlang) #read text inputs and return vars
library(dplyr)


set.seed(10)
dat <- data.frame(A=rnorm(10,0,1),
                  B=rnorm(10,0,1),
                  C=rnorm(10,0,1),
                  D=2001:2010)

calc_perct_chg <- function(input_data,
                           target_Var_list,
                           year_Var_name){

      #create new variable names
          mutate_varNames <- paste0(target_Var_list,rep("_pct_chg = ",length(target_Var_list)))

      #generate text for formula
          mutate_formula  <- lapply(target_Var_list,function(x){output <- paste0("(",x,"-lag(",x,"))/lag(",x,")");return(output)})
          mutate_formula  <- unlist(mutate_formula) #convert list to a vector

      #generate arguments for mutate
          mutate_args <<- paste0(mutate_varNames,collapse=",",mutate_formula)

      #data manipulation
           output <- input_data %>% 
                         arrange(!!parse_quo(year_Var_name,env=caller_env())) %>% 
                         mutate(!!parse_quo(mutate_args,env=caller_env()))
      #output data frame
          return(output)
}



# error: unexpected ','
calc_perct_chg(input_data =dat,
               target_Var_list=list("A","B","C"),
               year_Var_name="D") 

标签: rdataframedplyrtidyverse

解决方案


我认为将字符串评估为代码并不是一个好主意,而且我认为您过于复杂了。使用across它应该更容易。

library(dplyr)

calc_perct_chg <- function(input_data,
                           target_Var_list,
                           year_Var_name){
  input_data %>%
    arrange(across(all_of(year_Var_name))) %>%
    mutate(across(all_of(target_Var_list), ~(.x - lag(.x))/lag(.x)))
}

calc_perct_chg(input_data = dat,
               target_Var_list = c("A","B","C"),
               year_Var_name = "D") 

推荐阅读