求助:用R语言计算薪资年度演变、AAGR及补涨情况分析
薪资数据分析解决方案
可复现数据集
首先加载示例数据(仅2017年,后续会扩展为2017-2021年):
original_df <- structure(list(numero = c("133", "62", "75", "76", "86", "281"), tranche_age = c("20-30", "20-30", "20-30", "20-30", "20-30", "20-30"), tranche_anciennete = c("5 ans et moins", "5 à 10 ans", "5 ans et moins", "5 ans et moins", "5 à 10 ans", "5 à 10 ans"), code_statut = c("C", "E", "E", "E", "E", "E"), code_contrat = c("A", "A", "A", "A", "A", "A"), taux_demploi_mois = c(100, 100, 100, 100, 100, 100), echelon = c("E1", NA, NA, NA, NA, NA), niveau = c("N7", NA, NA, NA, NA, NA), brut_mensuel = c(NA, 786.13, 1156.95, 1156.95, 904.79, 904.79), estimation_annuelle = c(NA, 10219.69, 15040.35, 15040.35, 11762.27, 11762.27), annee = c(2017, 2017, 2017, 2017, 2017, 2017), primes_en_montant = c(0, 0, 0, 0, 0, 0), primes_en_pourcentage = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), brut_mensuel_ETP = c(NA, 786.13, 1156.95, 1156.95, 904.79, 904.79)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
需求说明
- 新增变量,计算2017-2021年每位工人
estimation_annuelle的年度演变(变化绝对值+涨幅百分比) - 计算5年的年均增长率(AAGR)
- 筛选年度涨幅低于2%的工人,分析后续年份的补涨情况及幅度
原代码问题分析
你尝试的代码存在以下问题:
group_by(annee, numero)会将每个工人的单一年份作为分组,无法跨年度计算薪资变化- 循环未按工人分组,会混淆不同工人的年份数据,导致计算逻辑错误
- 未处理
estimation_annuelle为NA的情况,会引发计算异常
# 原错误代码 test <- liste_complete %>% group_by(annee, numero) %>% select(numero, annee, estimation_annuelle)%>% data.frame() for(i in 1:length(test$estimation_annuelle)) { print((test[i+1,] - test[i,])/test[i,]) }
完整解决方案
1. 扩展数据集为2017-2021年
原数据仅包含2017年,先模拟生成2018-2021年的薪资数据(添加随机涨幅模拟真实场景):
library(dplyr) set.seed(123) # 设置随机种子保证结果可复现 liste_complete <- lapply(2017:2021, function(year) { original_df %>% mutate( annee = year, # 模拟薪资年度变化:-1%到5%的随机涨幅 estimation_annuelle = ifelse( !is.na(estimation_annuelle), round(estimation_annuelle * (1 + runif(nrow(.), -0.01, 0.05)), 2), NA ) ) }) %>% bind_rows()
2. 计算年度薪资演变
按工人分组,按年份排序后,用lag()函数计算年度变化:
liste_complete <- liste_complete %>% group_by(numero) %>% arrange(annee) %>% mutate( # 年度薪资变化绝对值 var_abs = estimation_annuelle - lag(estimation_annuelle), # 年度涨幅百分比(保留2位小数) var_pct = round((var_abs / lag(estimation_annuelle)) * 100, 2) ) %>% ungroup()
3. 计算年均增长率(AAGR)
AAGR为各年度涨幅的算术平均值(排除NA值):
aagr_result <- liste_complete %>% group_by(numero) %>% summarise( aagr = round(mean(var_pct, na.rm = TRUE), 2), # 统计有效数据的年份数 valid_years = n_distinct(annee[!is.na(estimation_annuelle)]) ) %>% ungroup()
4. 筛选低涨幅工人并分析补涨
筛选年度涨幅低于2%的记录,再分析后续年份的补涨情况:
# 筛选年度涨幅<2%的记录 low_growth_records <- liste_complete %>% filter(!is.na(var_pct), var_pct < 2) %>% select(numero, annee, estimation_annuelle, var_pct) # 分析后续年份补涨情况 catch_up_analysis <- low_growth_records %>% group_by(numero) %>% arrange(annee) %>% mutate( # 下一年的涨幅 next_year_pct = lead(var_pct), # 相对于低涨幅年份的总补涨幅度 catch_up_pct = round(((lead(estimation_annuelle) / estimation_annuelle) - 1) * 100, 2) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者gerardlambert
相关产品推荐
相关产品推荐

