如何使用dplyr和lubridate统计每年12月31日的活跃员工数?
统计每年年末活跃员工数的实现方案
嘿,别担心!你熟悉的dplyr和lubridate工具完全能搞定这个需求,核心是先明确**“12月31日活跃员工”的定义**:通常指在当年12月31日当天处于在职状态的员工,也就是同时满足两个条件:
- 入职日期 ≤ 当年12月31日
- 离职日期 ≥ 当年12月31日(或者离职日期为空,说明员工至今仍在职)
下面我用两种常见的思路给你演示具体实现,假设你的初始数据集名为employee_data,包含employee_id(唯一员工ID)、hire_date(入职日期)、termination_date(离职日期,可能有NA)这几个核心字段。
方法一:针对每个年末日期逐一筛选统计
这种思路直观易懂,适合需要明确指定统计年份范围的场景:
library(dplyr) library(lubridate) library(purrr) # 用于批量处理日期 # 1. 先把日期字段转成lubridate的标准日期格式(如果还没转的话) employee_data <- employee_data %>% mutate( hire_date = ymd(hire_date), termination_date = ymd(termination_date) ) # 2. 确定要统计的年份范围(从最早入职年份到当前年份) min_year <- year(min(employee_data$hire_date, na.rm = TRUE)) max_year <- year(today()) # 3. 生成所有要统计的年末日期(每年12月31日) year_end_dates <- ymd(paste0(min_year:max_year, "-12-31")) # 4. 批量处理每个年末日期,统计活跃员工数 active_by_year <- map_dfr(year_end_dates, function(end_date) { employee_data %>% # 筛选符合条件的活跃员工 filter( hire_date <= end_date, (is.na(termination_date) | termination_date >= end_date) ) %>% # 去重员工ID(避免同一员工因数据重复被多次计数) distinct(employee_id) %>% # 统计数量并关联对应年份 summarise( year = year(end_date), active_employee_count = n() ) }) # 查看最终结果 active_by_year
方法二:基于员工在职年份区间展开统计
这种思路适合先梳理每个员工的在职年份跨度,再统计各年份的活跃人数:
library(dplyr) library(lubridate) employee_data <- employee_data %>% mutate( hire_date = ymd(hire_date), termination_date = ymd(termination_date) ) %>% # 计算每个员工的在职起始年份和结束年份(未离职的用当前年份) mutate( start_year = year(hire_date), end_year = ifelse(is.na(termination_date), year(today()), year(termination_date)) ) %>% # 展开每个员工在职的所有年份 rowwise() %>% mutate(year = list(start_year:end_year)) %>% unnest(year) %>% # 过滤掉离职年份中,员工在年末前已离职的情况 filter( is.na(termination_date) | (year(termination_date) == year & termination_date >= ymd(paste0(year, "-12-31"))) ) %>% # 按年份分组,统计唯一员工数 distinct(employee_id, year) %>% group_by(year) %>% summarise(active_employee_count = n()) %>% ungroup()
关键逻辑说明
你熟悉的filter、mutate、distinct、group_by、summarise全程都用到了:
filter用来精准筛选年末当天在职的员工distinct确保每个员工在同一年份只被计数一次lubridate的year()、ymd()用来轻松处理日期格式和年份提取- 两种方法都能得到你想要的“年份+年末活跃员工数”的目标数据集
内容的提问来源于stack exchange,提问作者LetEpsilonBeLessThanZero
相关产品推荐
相关产品推荐

