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

如何按两个变量分组计算数据集变量均值?R语言group_by问题排查

问题:按年份与主主题聚合计算百分比均值,结果缺失部分年份

需求说明

需要按年份和主主题两个维度聚合数据集,计算百分比列的均值。以下是数据集示例与期望输出:

原始数据集示例

年份主主题子主题百分比
2000110123
2000110443
2000113284
2000220127
2000223314
2001110127
2001110455
2001113272
2001220124
2001223312

期望输出

年份主主题平均百分比
2000150
2000220.5
2001151.3
2001218

尝试的代码与问题

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:53:15