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) # 可选删除中间计算字段
逻辑说明
- 按员工ID分组,确保只匹配同一名员工的任职记录
- 对晋升事件行,通过
floor_date取事件日期当月第一天,减1天即可得到上月月末日期 - 用
match查找同组内End.Date等于目标上月月末的记录,取对应的Title赋值给Old_Title,非晋升行直接填NA - 若同一名员工同一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
相关产品推荐
相关产品推荐

