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

按年计算fail与attend百分比并使用geom_line()绘图的问题

解决年度fail/attend百分比趋势线绘制问题

问题分析

你的代码存在两个核心问题:

  • 误用mutate而非summarise:mutate会保留原始数据的每一行,导致计算出的perc_fail/perc_attend是单条记录在年度对应总和中的占比,而非年度整体的fail/attend比例。
  • 未适配ggplot的绘图格式:没有将两个指标整理为适合分组绘图的长格式,也未指定y轴变量和分组美学,导致geom_line无法正确生成两条趋势线。

解决方案

完整可运行代码

library(tidyverse)

df %>%
  # 按年份聚合,计算年度fail/attend的百分比
  group_by(year) %>%
  summarise(
    perc_fail = sum(fail)/n() * 100,  # 年度fail占比转百分比
    perc_attend = sum(attend)/n() * 100  # 年度attend占比转百分比
  ) %>%
  # 宽格式转长格式,适配ggplot分组绘图
  pivot_longer(
    cols = starts_with("perc_"),
    names_to = "metric",
    values_to = "percentage",
    names_prefix = "perc_"  # 去除前缀让指标名称更简洁
  ) %>%
  # 绘制趋势线
  ggplot(aes(x = year, y = percentage, color = metric, group = metric)) +
  geom_line(linewidth = 1) +
  labs(
    x = "年份",
    y = "百分比(%)",
    color = "指标",
    title = "年度fail/attend比例趋势"
  ) +
  theme_minimal()

关键步骤解释

  1. 按年聚合计算比例
    使用summarise替代mutate,直接计算每年的fail/attend占比:sum(fail)统计年度内fail=1的总次数,n()统计年度总观测数,两者比值即为该年度的fail率。

  2. 转换为长格式数据
    通过pivot_longer将宽格式的perc_fail和perc_attend列合并为metric(指标类型)和percentage(百分比值)两列,让ggplot可以通过color和group参数区分两条趋势线。

  3. 绘制趋势线
    在aes中指定group = metric确保不同指标的点被正确连接成线,color = metric让两条线以不同颜色区分,同时添加标签和主题提升图表可读性。

可选调整

  • 若不需要百分比而是原始比例,去掉代码中的*100即可。
  • 若希望年份轴为连续数值,可在聚合前转换类型:mutate(year = as.integer(as.character(year)))。

内容的提问来源于stack exchange,提问作者a_todd12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:05:15