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

在summarize_at()中用mtcars列作为weighted.mean参数的报错问题

解决summarize_at中传递weighted.mean的w参数报错问题

这个问题我之前也踩过坑!核心原因是summarize_at这类scoped动词的参数传递机制:当你直接把w = wt作为额外参数传给weighted.mean时,R会默认在全局环境里找wt,而不是在分组后的mtcars数据框里,所以才会报"object 'wt' not found"的错误。

下面给你两种靠谱的解决办法:

方法1:用匿名函数(兼容旧版dplyr)

用波浪号~创建匿名函数,把当前要计算的列用.表示,这样就能让wt正确引用数据框里的列:

mtcars %>% group_by(cyl) %>% summarize_at(vars(disp, hp), ~weighted.mean(., w = wt))

运行后就能得到正确的加权均值结果:

# A tibble: 3 × 3
    cyl  disp    hp
  <dbl> <dbl> <dbl>
1     4  105.  82.6
2     6  183. 122. 
3     8  353. 209. 

方法2:用across函数(推荐,dplyr 1.0.0+)

现在dplyr官方已经推荐用across()替代summarize_at()这类scoped函数了,写法更直观,同样用匿名函数传递参数:

mtcars %>% group_by(cyl) %>% summarize(across(c(disp, hp), ~weighted.mean(., w = wt)))

这个写法和方法1效果完全一致,但代码更符合dplyr的现代语法规范,后续维护也更方便。

简单总结:只要把weighted.mean包装在匿名函数里,就能让wt在数据框的环境里被正确识别,而不是跑到全局环境里找变量啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:11:33