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

如何在R语言中处理缺失年份数据时计算百分比变化?

需求与解决方案

需求说明

按学年计算入学人数的百分比变化,当学年数据缺失(非连续学年)时,不计算跨年度的变化值,保留NA,同时需按多所学校、多个分组进行计算。

示例数据

School      Academic Year  Group   Enrollment pct_change  
 1 School 1  2018-19        Overall 450        ANSWER 
 2 School 1  2017-18        Overall 630        NA
 3 School 1  2015-16        Overall 635        ANSWER
 4 School 1  2014-15        Overall 750        ANSWER
 5 School 1  2013-14        Overall 704        ANSWER 

当前代码问题

你当前使用的lead()函数会直接取分组内的下一条记录计算,即使学年不连续(比如2017-18和2015-16之间间隔一年),也会错误地生成跨年度的变化值,无法满足需求。

修改后代码

library(dplyr)

data <- data %>%
  # 提取学年起始年份,用于判断连续性
  mutate(Year_Start = as.numeric(substr(`Academic Year`, 1, 4))) %>%
  group_by(School, Group) %>%
  arrange(desc(Year_Start)) %>% # 按学年从新到旧排序
  mutate(
    # 验证当前学年与下一学年是否连续
    is_consecutive = Year_Start == lead(Year_Start) + 1,
    # 仅连续学年计算百分比变化,否则返回NA
    pct_change = ifelse(
      is_consecutive,
      ((Enrollment - lead(Enrollment)) / Enrollment) * 100,
      NA
    )
  ) %>%
  select(-Year_Start, -is_consecutive) %>% # 移除辅助计算列
  ungroup()

代码解释

  • 学年转换:通过substr提取学年的起始年份(如2018-19转为2018),将文本格式的学年转为可数值比较的格式。
  • 排序:arrange(desc(Year_Start))确保每个学校-分组内的记录按学年从新到旧排序,保证lead()获取的是上一学年的数据。
  • 连续性判断:is_consecutive列检查当前学年的起始年份是否等于下一学年起始年份+1,确保仅连续学年才计算变化率。
  • 条件计算:使用ifelse仅在学年连续时生成百分比变化值,否则返回NA,避免跨缺失学年的错误计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:32:52