You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:54:58