dplyr中ungroup()用法及分组统计后保留原维度实现方法
解决方案:用
mutate()替代summarize()实现分组均值的重复填充 这问题我熟!你用summarize()的核心问题在于,它会把每个分组(这里是country)压缩成一行汇总结果,所以最终行数自然等于唯一国家的数量。要保留原数据集的country-year维度,你需要换用mutate()——它会在原数据的每一行上添加分组计算的结果,完全不改变原数据的行数和结构。
直接实现的代码示例
library(dplyr) library(gapminder) # 按country分组计算均值,新增列并保留原数据所有行 result <- gapminder %>% group_by(country) %>% mutate(country_pop_mean = mean(pop, na.rm = TRUE)) %>% # 建议加na.rm处理可能的缺失值 ungroup()
效果说明
运行这段代码后,result的行数和原gapminder完全一致:每个country-year的行里,country_pop_mean列都会重复显示对应国家的人口均值,完美匹配你要的country-year维度需求。
备用方法:先汇总再合并
如果你已经有了用summarize()生成的均值表,也可以通过左连接合并回原数据集:
# 先生成每个国家的均值表 mean_table <- gapminder %>% group_by(country) %>% summarize(country_pop_mean = mean(pop, na.rm = TRUE)) %>% ungroup() # 左连接回原数据集 result <- gapminder %>% left_join(mean_table, by = "country")
不过第一种用mutate()的方法更直接高效,不需要额外的合并步骤,推荐优先使用。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

