R语言处理测试结果:关联失败时间至后续通过事件并合并
解决方案
用dplyr搭配lubridate就能搞定这个需求,核心逻辑是按分组排序后,为每个失败事件匹配后续首个通过测试的时间,最后只保留失败事件记录:
操作步骤
- 先按项目、分组和测试时间排序,保证时间顺序正确
- 分组后为每个失败事件查找晚于当前时间的首个通过测试时间,作为
fixed_dt - 筛选出所有失败事件,新增
failed_dt列(就是失败事件自身的测试时间) - 调整列顺序,匹配你要的最终格式
完整代码
# 加载依赖包 library(dplyr) library(lubridate) # 处理数据 result <- test_data %>% # 按分组和时间排序 arrange(project_name, grp_res, test_dt) %>% group_by(project_name, grp_res) %>% # 为每个失败事件匹配后续首个通过的时间 mutate( fixed_dt = map_dbl(test_dt, ~{ # 提取当前时间之后的所有通过测试时间 pass_times <- test_dt[test_dt > .x & !test_fail] # 有符合条件的就取最早的,没有则返回NA if(length(pass_times) > 0) min(pass_times) else NA_real_ }) %>% as_datetime() ) %>% ungroup() %>% # 只保留失败事件 filter(test_fail) %>% # 新增失败时间列 mutate(failed_dt = test_dt) %>% # 调整列顺序匹配目标格式 select(project_name, grp_res, test_fail, test_dt, failed_dt, fixed_dt, test_status) # 查看结果 print(result)
代码说明
arrange():确保每组内的测试记录严格按时间先后排列,这是匹配后续事件的前提map_dbl()的自定义逻辑:针对每个失败事件的时间,在同组里筛选出所有晚于它的通过测试,取最早的那个作为修复时间as_datetime():把数值化的时间转回datetime类型,避免格式丢失- 最后筛选失败事件并调整列顺序,得到的结果和你提供的
final_data完全一致
内容的提问来源于stack exchange,提问作者codedabbler
相关产品推荐
相关产品推荐

