Dplyr中mean()函数未按分组计算均值的问题排查
dplyr分组计算均值失效问题解决
问题描述
使用dplyr按Country字段分组后,通过mutate调用mean()计算Quarterly列的分组均值,结果返回的却是整列的全局均值,而非各分组的单独均值。相关代码及错误输出如下:
测试数据结构
data <- structure(list(Country = c("Argentina", "Argentina", "Argentina", "USA", "USA", "USA"), Indicator = c("Inflation", "Inflation", "Inflation", "Inflation", "Inflation", "Inflation"), Year = c("Y2022M3", "Y2022M6", "Y2022M9", "Y2022M3", "Y2022M6", "Y2022M9"), Quarterly = c(54.4386140151883, 61.641920578111, 76.9071987097229, 8.0003895903483, 8.58063131836198, 8.31761217342508), Monthly = c(56.0677775901444, 64.7393874239595, 81.4559428900954, 8.55758636823278, 8.99522060858813, 8.22241023434256 )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
错误操作代码及输出
data %>% group_by(Country) %>% mutate(Year_average = mean(Quarterly, na.rm = T)) # A tibble: 6 x 6 # Groups: Country [2] Country Indicator Year Quarterly Monthly Year_average <chr> <chr> <chr> <dbl> <dbl> <dbl> 1 Argentina Inflation Y2022M3 54.4 56.1 36.3 2 Argentina Inflation Y2022M6 61.6 64.7 36.3 3 Argentina Inflation Y2022M9 76.9 81.5 36.3 4 USA Inflation Y2022M3 8.00 8.56 36.3 5 USA Inflation Y2022M6 8.58 9.00 36.3 6 USA Inflation Y2022M9 8.32 8.22 36.3
核心原因及解决方案
1. 包冲突(最常见)
若环境中同时加载了plyr包,其mutate函数会覆盖dplyr的同名函数,导致分组逻辑失效。
解决办法:
- 明确指定使用dplyr的
mutate:
data %>% group_by(Country) %>% dplyr::mutate(Year_average = mean(Quarterly, na.rm = T))
- 卸载plyr并重新加载dplyr:
detach("package:plyr", unload = TRUE) library(dplyr)
2. dplyr版本过旧
旧版本dplyr可能存在分组计算的bug,更新至最新版本即可修复:
install.packages("dplyr") library(dplyr)
3. 验证分组有效性
可先通过以下代码确认分组是否正确应用:
# 查看当前分组变量 data %>% group_by(Country) %>% group_vars() # 查看分组计数 data %>% group_by(Country) %>% count()
正确运行结果
执行修复后的代码,将得到符合预期的分组均值:
# A tibble: 6 x 6 # Groups: Country [2] Country Indicator Year Quarterly Monthly Year_average <chr> <chr> <chr> <dbl> <dbl> <dbl> 1 Argentina Inflation Y2022M3 54.4 56.1 64.3 2 Argentina Inflation Y2022M6 61.6 64.7 64.3 3 Argentina Inflation Y2022M9 76.9 81.5 64.3 4 USA Inflation Y2022M3 8.00 8.56 8.30 5 USA Inflation Y2022M6 8.58 9.00 8.30 6 USA Inflation Y2022M9 8.32 8.22 8.30
内容的提问来源于stack exchange,提问作者Erazijus
相关产品推荐
相关产品推荐

