R语言pmap调用tidyeval自定义分组统计函数报错如何修复?
问题修复方案
错误原因
- pmap接收的参数列表中直接书写
Department时,R会在全局环境搜索该名称的对象,无法识别为传入自定义函数的列名参数,因此触发未找到对象的报错。 - 你的需求仅需要迭代年份这一个可变参数,
data和colName均为固定值,不需要使用多参数映射的pmap,使用单参数迭代的map即可满足需求。
修复代码
方案1:不修改原函数,直接调整迭代写法
仅迭代年份,固定按Department维度统计:
library(purrr) # 迭代年份向量调用自定义函数 yearly_turnover <- map(years, ~ emp_term_var(data = df, colName = Department, year = .x)) # 给结果列表按年份命名,方便后续提取 names(yearly_turnover) <- years # 调用示例:提取2015年的统计结果 yearly_turnover[["2015"]]
方案2:修改函数支持字符串传参,避免非标准评估传递问题
如果需要灵活传入列名字符串,可以调整原函数的参数接收逻辑,调用时更不容易出错:
# 修改后的函数 emp_term_var <- function(data, colName, year = "2015") { # 把字符串列名转为rlang符号 colName <- rlang::sym(colName) term_test <- data %>% filter(lubridate::year(DateofTermination) == year) %>% group_by(!!colName) %>% count(!!colName) %>% janitor::clean_names() return(term_test) } # 调用时直接传入列名字符串即可 yearly_turnover <- map(years, ~ emp_term_var(df, "Department", .x))
多维度+多年份迭代方案
如果你需要同时按多个维度(比如Department、position、managername)统计多年的离职数据,可以用pmap处理多参数组合:
# 定义要统计的维度列(字符串格式) stats_cols <- c("Department", "position", "managername") # 生成所有 数据框+维度列+年份 的参数组合 param_grid <- expand.grid( data = list(df), colName = stats_cols, year = years, stringsAsFactors = FALSE ) # 多参数迭代调用 all_stats <- pmap(param_grid, emp_term_var)
内容的提问来源于stack exchange,提问作者Taren Shaw
相关产品推荐
相关产品推荐

