r - 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")
解决方案
我认为将字符串评估为代码并不是一个好主意,而且我认为您过于复杂了。使用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")
推荐阅读
- java - TCP 连接在 Java 中工作,但在 C# 中不工作
- powershell - 使用 PowerShell 忽略带有 SQL 查询的循环的空结果
- hyperledger-composer - 使用 Hyperledger-Composer 开发者教程的问题
- python - 在底图上使用 LassoSelector
- javascript - 为什么当我使用 jquery 循环并取消选中复选框时,复选框不会被取消选中?
- android - adjustResize 不适用于 ScrollView
- html - 如何删除嵌套伪元素的 CSS 中的最后一个子元素?
- php - 使用包含表单数据的数组更新数据库
- javascript - 在 ChartJS 散点图中移动零线
- javascript - 使用 onscroll 或类似事件滚动到元素