如何在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
相关产品推荐
相关产品推荐

