基于日期范围生成年度哑变量,计算员工流动数据的方法问询
员工流动分析解决方案
一、高效统计年度雇佣/离职人数(无需手动生成哑变量)
生成哑变量会导致数据框过度冗余,更高效的方式是直接统计年度雇佣和离职人数,再构建完整的年度汇总表:
# 加载所需包 library(lubridate) library(tidyverse) # 1. 统计每年雇佣人数 hire_summary <- ssh %>% count(hireyear, name = "NumberHired") %>% rename(Year = hireyear) # 2. 统计每年离职人数(排除未离职的NA值) exit_summary <- ssh %>% filter(!is.na(exityear)) %>% count(exityear, name = "NumberExited") %>% rename(Year = exityear) # 3. 创建1972-2023完整年份序列 full_year_range <- tibble(Year = 1972:2023) # 4. 合并数据并计算净变化、累计员工数 annual_flow <- full_year_range %>% left_join(hire_summary, by = "Year") %>% left_join(exit_summary, by = "Year") %>% # 填补无雇佣/离职年份的0值 mutate( NumberHired = replace_na(NumberHired, 0), NumberExited = replace_na(NumberExited, 0), NetChange = NumberHired - NumberExited, # 累计员工总数是逐年累加净变化 CurrentTotal = cumsum(NetChange) )
运行上述代码后,annual_flow就是你需要的年度汇总表,包含Year、NumberHired、NumberExited、NetChange、CurrentTotal所有字段。
二、若需生成年度哑变量(可选)
如果确实需要生成每个年份的雇佣/离职哑变量列,可以用dplyr::across批量生成,无需手动写每一行ifelse:
# 定义年份范围 target_years <- 1972:2023 # 生成雇佣哑变量(hiredXXXX格式) ssh <- ssh %>% mutate( across(all_of(target_years), ~ as.integer(hireyear == .x), .names = "hired{.x}") ) # 生成离职哑变量(exitedXXXX格式) ssh <- ssh %>% mutate( across(all_of(target_years), ~ as.integer(exityear == .x), .names = "exited{.x}") )
说明
- 优先推荐第一种方法:避免生成冗余列,计算效率更高,且符合tidy数据规范,后续分析更便捷。
- 第二种方法生成的哑变量列,可通过
colSums统计年度总数,比如colSums(ssh %>% select(starts_with("hired"))),但远不如第一种方法直接。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

