R语言dplyr按分组计算列均值返回单值问题解决
问题根因
代码返回全量数据单一均值,是dplyr链式操作的写法错误导致的:
- 在
group_by()、arrange()、summarize()这类dplyr函数内部,不要重复用数据框$列名的格式调用列,也不要给列名加外层引号。这种写法会直接读取原始数据框的整列数据,完全绕过分组的上下文逻辑,最终计算的是全量数据的总平均值。 - 你写的
arrange(mydf2, desc('Normalized Month'))存在两个错误:一是链式操作中不需要再传入完整数据框mydf2作为参数,二是给列名加引号后desc()识别不到真实列,排序逻辑失效。
正确实现代码
library(dplyr) GetAvg <- mydf %>% # 筛选Normalized Month大于0的记录 filter(`Normalized Month` > 0) %>% # 列名带空格必须用反引号包裹,不需要转因子可跳过这步 mutate(`Normalized Month` = factor(`Normalized Month`)) %>% # 分组直接传入列名即可,无需加数据框前缀 group_by(`Normalized Month`) %>% # 排序直接写列逻辑,无需传数据框、不要给列名加引号 arrange(desc(`Normalized Month`)) %>% # 分组计算均值,直接引用列名 summarize(Mean = mean(Oil_Prod, na.rm = TRUE))
样例数据运行结果
基于你提供的测试数据,运行后输出结构完全符合预期:
| Normalized Month | Mean |
|---|---|
| 5 | 16867.818 |
| 4 | 20203.279 |
| 3 | 30461.242 |
| 2 | 17407.327 |
| 1 | 3071.829 |
写法提示
- dplyr的
%>%管道符会自动把前一步的处理结果传入下一个函数的第一个参数位置,所以管道内的操作函数只需要直接写列名相关逻辑即可,不需要重复指定数据框来源。 - 如果不需要按月份降序展示结果,可以直接删除
arrange()行,不会影响分组计算的准确性。 - 带空格、特殊字符的列名,只需要用反引号(`)包裹即可,不要用单/双引号包裹。
内容的提问来源于stack exchange,提问作者CodeMaster
相关产品推荐
相关产品推荐

