【问题标题】:dplyr: how to pass strings to dplyr's mutate argumentdplyr:如何将字符串传递给 dplyr 的 mutate 参数
【发布时间】:2021-03-12 02:33:48
【问题描述】:

我想编写一个辅助函数,一次性总结 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") 

【问题讨论】:

    标签: r dataframe dplyr tidyverse


    【解决方案1】:

    我认为将字符串评估为代码不是一个好主意,而且我认为您过于复杂了。使用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") 
    

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 2015-07-01
      • 1970-01-01
      • 2018-11-04
      • 2018-04-01
      • 2015-03-14
      • 2017-10-16
      • 1970-01-01
      相关资源
      最近更新 更多