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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:10:42