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

R语言按员工分组为晋升记录匹配前序职位名称的实现方法

实现方案

依赖包

  • dplyr:用于分组运算、字段变换
  • lubridate:用于日期偏移计算

前置处理

首先确保数据框中的日期字段为Date类型,避免字符串匹配出错,可根据你实际的日期格式调整format参数:

library(dplyr)
library(lubridate)

df <- df %>%
  mutate(
    Event.Date = as.Date(Event.Date, format = "%Y-%m-%d"),
    End.Date = as.Date(End.Date, format = "%Y-%m-%d")
  )

核心计算代码

df <- df %>%
  group_by(User.Employee.ID) %>%
  mutate(
    # 计算晋升事件需要匹配的上月月末日期
    target_end = if_else(Event == "Promotion", floor_date(Event.Date, unit = "month") - days(1), as.Date(NA)),
    # 匹配对应任职记录的职位作为旧职位
    Old_Title = if_else(
      Event == "Promotion",
      Title[match(target_end, End.Date)],
      NA_character_
    )
  ) %>%
  ungroup() %>%
  select(-target_end) # 可选删除中间计算字段

逻辑说明

  1. 按员工ID分组,确保只匹配同一名员工的任职记录
  2. 对晋升事件行,通过floor_date取事件日期当月第一天,减1天即可得到上月月末日期
  3. 用match查找同组内End.Date等于目标上月月末的记录,取对应的Title赋值给Old_Title,非晋升行直接填NA
  4. 若同一名员工同一End.Date存在多条记录,match默认取第一条符合条件的记录,可根据需求替换为first(Title[End.Date == target_end], default = NA_character_)明确逻辑

效果验证

用测试数据验证输出符合预期:

# 测试样本
test_df <- tibble(
  User.Employee.ID = rep("E001", 3),
  Event.Date = as.Date(c("2023-04-30", "2023-05-01", "2023-06-15")),
  End.Date = as.Date(c("2023-04-30", "2023-05-31", NA)),
  Event = c("Data Change", "Promotion", "Data Change"),
  Title = c("初级工程师", "中级工程师", "中级工程师")
)

运行代码后,第二行晋升记录的Old_Title会正确返回初级工程师,其余两行Old_Title为NA。


内容的提问来源于stack exchange,提问作者MariKo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:15:04