如何按两个变量分组计算数据集变量均值?R语言group_by问题排查
问题:按年份与主主题聚合计算百分比均值,结果缺失部分年份
需求说明
需要按年份和主主题两个维度聚合数据集,计算百分比列的均值。以下是数据集示例与期望输出:
原始数据集示例
| 年份 | 主主题 | 子主题 | 百分比 |
|---|---|---|---|
| 2000 | 1 | 101 | 23 |
| 2000 | 1 | 104 | 43 |
| 2000 | 1 | 132 | 84 |
| 2000 | 2 | 201 | 27 |
| 2000 | 2 | 233 | 14 |
| 2001 | 1 | 101 | 27 |
| 2001 | 1 | 104 | 55 |
| 2001 | 1 | 132 | 72 |
| 2001 | 2 | 201 | 24 |
| 2001 | 2 | 233 | 12 |
期望输出
| 年份 | 主主题 | 平均百分比 |
|---|---|---|
| 2000 | 1 | 50 |
| 2000 | 2 | 20.5 |
| 2001 | 1 | 51.3 |
| 2001 | 2 | 18 |
尝试的代码与问题
使用dplyr的group_by聚合后,结果仅显示部分年份,未覆盖数据集中所有年份:
table <- policymoods %>% group_by(majortopic, year) %>% summarise(averagepercent = mean(percent)) %>% na.omit()
解决方案
1. 修正na.omit()的使用
na.omit()会删除任何包含NA值的整行,包括某年份-主题组的均值为NA、或年份/主主题字段本身为NA的行,这是导致部分年份缺失的核心原因之一。
若需保留所有年份-主题组合(即使均值为NA),应去掉na.omit(),并在计算均值时忽略NA值:
table <- policymoods %>% group_by(year, majortopic) %>% # 调整分组顺序,与期望输出列顺序一致 summarise(averagepercent = mean(percent, na.rm = TRUE))
若仅需过滤掉均值为NA的行,改用filter精准控制:
table <- policymoods %>% group_by(year, majortopic) %>% summarise(averagepercent = mean(percent, na.rm = TRUE)) %>% filter(!is.na(averagepercent))
2. 补全缺失的年份-主题组合
如果原始数据中某些年份没有对应主主题的观测,聚合后不会生成该组合。若需强制展示所有可能的年份-主题配对,可使用tidyr::complete()补全:
library(tidyr) table <- policymoods %>% group_by(year, majortopic) %>% summarise(averagepercent = mean(percent, na.rm = TRUE)) %>% ungroup() %>% # 补全所有原始数据中存在的年份和主主题组合 complete(year = unique(policymoods$year), majortopic = unique(policymoods$majortopic))
补全后,无观测的组合会显示averagepercent为NA,可根据需求进一步处理(如填充0)。
3. 验证列名与数据完整性
确认代码中的列名(year、majortopic、percent)与原始数据集的列名完全匹配,避免因列名不一致导致分组失效。同时检查原始数据是否确实包含所有预期的年份记录。
内容的提问来源于stack exchange,提问作者Casa_De_Agua
相关产品推荐
相关产品推荐

