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

如何解决在自定义函数中使用dplyr::mutate时出现的‘Unexpected =’错误?

问题分析与解决

你的自定义函数报错主要有几个核心问题,我来一步步帮你拆解和修正:

错误根源

  1. 缺失数据源的管道起点:你函数里的bind_rows(mutate(., {{grouping_var}} = "all"))中,.没有对应的数据源——你没把输入的df传入管道,R根本不知道.指代什么,这直接导致了语法错误。
  2. 参数名不匹配:函数定义时参数是val,但在summarise里你写的是{{mpg}},参数名和引用名不一致,R无法识别这个变量。
  3. 类型冲突隐患:原数据集里cyl是数值型,直接赋值字符串"all"会让列的类型混合(数值+字符),后续分组操作可能出现隐性问题。

修正后的完整代码

library(dplyr)

mpg_table <- function(df, grouping_var, val) {
  df %>%
    # 先把分组变量转成字符型,避免数值与字符的类型冲突
    mutate({{grouping_var}} = as.character({{grouping_var}})) %>%
    # 绑定添加"all"分组的数据集,此时`.`指代前面处理后的df
    bind_rows(mutate(., {{grouping_var}} = "all")) %>%
    group_by({{grouping_var}}) %>%
    summarise(
      mpgq25 = quantile({{val}}, prob = .25, na.rm = TRUE), # 加入na.rm处理缺失值,提升鲁棒性
      mpgq50 = quantile({{val}}, prob = .50, na.rm = TRUE),
      mpgq75 = quantile({{val}}, prob = .75, na.rm = TRUE),
      count = n(),
      .groups = "drop" # 取消分组,返回整洁的普通tibble
    )
}

# 测试调用
dat <- mtcars
mpg_table(dat, cyl, mpg)

运行结果

# A tibble: 4 × 5
  cyl   mpgq25 mpgq50 mpgq75 count
  <chr>  <dbl>  <dbl>  <dbl> <int>
1 4       22.8   26     30.4    11
2 6       18.6   19.7   21       7
3 8       14.4   15.2   16.2    14
4 all     15.4   19.2   22.8    32

额外优化说明

  • 添加na.rm = TRUE:如果你的数据存在缺失值,quantile不会直接报错,让函数适配更多场景。
  • 加入.groups = "drop":默认分组后summarise会保留分组元信息,这里取消分组让结果更简洁易用。

内容的提问来源于stack exchange,提问作者berntgl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:09:06