使用map系列函数调用返回数据框的自定义函数时遇错求助
问题解决与优化方案
一、报错原因与修复
你遇到的Error in as_mapper(.f) : argument ".f" is missing, with no default是因为map2_dfr调用方式错误:管道运算符%>%把mtcars传给了map2_dfr的第一个参数(本来该放var1_vector),导致必须指定的函数参数.f缺失,从而触发报错。
正确调用方式+函数bug修复
另外你的自定义函数里存在重命名bug:原代码会把Var1_levels设为变量名(比如"cyl")而非变量的实际取值(4/6/8),需要用all_of()引用字符串指定的列名来修正。以下是完整修复后的代码:
library(dplyr) library(purrr) # 修正后的自定义函数 ugh <- function(data, var1, var2){ tab_n <- data %>% group_by_at(c(var1, var2)) %>% summarise(Numerator = n(), .groups = "drop") %>% group_by_at(c(var2)) %>% mutate(Denominator = sum(Numerator), Pct = Numerator/Denominator*100, Var1 = var1, Var2 = var2) %>% # 用all_of()引用字符串列名,将原变量列重命名为统一格式 rename(Var1_levels = all_of(var1), Var2_levels = all_of(var2)) } # 变量参数向量 var1_vector <- rep("cyl", 2) var2_vector <- c("gear", "carb") # 正确调用map2_dfr生成合并结果 plswork <- map2_dfr(var1_vector, var2_vector, ~ugh(data = mtcars, var1 = .x, var2 = .y))
二、更高效的批量汇总方案
如果需要扩展到更多变量组合,用tidyr::crossing生成参数组合表,再结合pmap_dfr批量处理,代码更简洁且扩展性更强:
library(tidyr) # 生成所有需要的参数组合(可自由扩展var1/var2的取值) param_df <- crossing(var1 = "cyl", var2 = c("gear", "carb")) # 用pmap_dfr批量处理所有参数组合 output <- param_df %>% pmap_dfr(~ugh(mtcars, ..1, ..2))
比如要同时分析cyl和am两个变量分别按gear、carb汇总,只需修改参数表:
param_df <- crossing(var1 = c("cyl", "am"), var2 = c("gear", "carb"))
三、无自定义函数的简化实现
如果参数组合较少,也可以直接用dplyr+tidyr组合完成,无需自定义函数:
mtcars %>% # 处理第一组变量组合:cyl vs gear mutate(var1 = "cyl", var1_level = cyl) %>% group_by(var1, var2 = gear, var1_level) %>% summarise(Numerator = n(), .groups = "drop") %>% group_by(var1, var2) %>% mutate(Denominator = sum(Numerator), Pct = Numerator/Denominator*100, var2_level = var2) %>% # 绑定第二组变量组合:cyl vs carb的结果 bind_rows( mtcars %>% mutate(var1 = "cyl", var1_level = cyl) %>% group_by(var1, var2 = carb, var1_level) %>% summarise(Numerator = n(), .groups = "drop") %>% group_by(var1, var2) %>% mutate(Denominator = sum(Numerator), Pct = Numerator/Denominator*100, var2_level = var2) )
内容的提问来源于stack exchange,提问作者Ddfox
相关产品推荐
相关产品推荐

