如何在R中将aggregate计算的参保均值转换为百分比并完成分组趋势可视化
参保率趋势可视化实现方案
问题核心
你现在的代码逻辑其实已经算对了参保占比:因为参保状态是0/1二值变量,分组求均值的结果就是对应组的参保比例。之所以没达到你要的百分比展示效果,是几个小细节没处理:
- 计算出来的结果是小数形式(比如0.57就是57%),没有转成大家习惯的百分比刻度
- 图上没有直接标注每个点的具体数值,需要靠坐标轴估算
- 生成的
age_cat字段值后面带了多余的空格("below 19 "/"above 19 "),容易导致颜色匹配、分类识别出错 - 只有散点没有连线,很难直观对比两个组随年份的变化趋势
可直接运行的实现代码
第一步:修正数据预处理逻辑
调整分类字段格式,直接把聚合结果换算为百分比单位:
# 移除分类字段的多余空格 database$age_cat[database$under19 == 1] <- "below 19" database$age_cat[database$under19 == 0] <- "above 19" # 聚合计算各年龄组、各年份的参保占比(转成百分比单位) percentage <- aggregate(insured ~ age_cat + year, data = database, FUN = function(x) mean(x, na.rm = TRUE) * 100) # 重命名结果列,避免语义混淆 names(percentage)[3] <- "insurance_pct"
适配补充:如果你的
insured字段是文本值(如“已参保”/“未参保”)而非0/1数值,需要先做编码转换再计算:database$insured_num <- ifelse(database$insured == "已参保", 1, 0) # 后续聚合时替换为insured_num字段即可正常计算占比
第二步:调整ggplot绘图逻辑
实现带数值标注、趋势连线的百分比趋势图:
library(ggplot2) ggplot(data = percentage, aes(x = year, y = insurance_pct, color = age_cat)) + # 同年龄组的趋势连线 geom_line(linewidth = 1) + # 对应年份的散点 geom_point(size = 3) + # 直接在散点上方标注百分比数值,不需要靠坐标轴估算 geom_text(aes(label = paste0(round(insurance_pct, 1), "%")), vjust = -1, size = 3) + # 匹配你最初设置的蓝、红配色 scale_color_manual(values = c("above 19" = "blue", "below 19" = "red")) + # x轴展示1991-2008的所有年份刻度,避免年份漏看 scale_x_continuous(breaks = seq(1991, 2008, 1)) + # 给数值标注预留顶部空间,避免被图边界截断 scale_y_continuous(limits = c(0, max(percentage$insurance_pct, na.rm = TRUE) + 5)) + # 明确轴和图例标题 labs(x = "年份", y = "参保人群占比(%)", color = "年龄分组") + # 简洁无冗余的主题 theme_bw()
效果说明
调整后的图表会直接在每个散点上方显示对应年份、对应年龄组的参保百分比数值,两个年龄组分别用蓝色、红色连线区分,x轴完整展示1991-2008的所有年份刻度,不需要估算就能直接读出每一年的对应占比,也能清晰观察两个组的参保率变化趋势。
内容的提问来源于stack exchange,提问作者bilal hassanin
相关产品推荐
相关产品推荐

