在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
相关产品推荐
相关产品推荐

