寻求条件筛选的更优雅解决方案——717机组数据优化处理
优化R代码:针对特定机组-机型组合筛选最新记录
核心需求回顾
仅对**717机型+飞行员(CREW_INDICATOR="P")**的记录,按指定字段分组后保留updated_dt最大的条目;其余机型、717机型的乘务员(CREW_INDICATOR="FA")数据原样保留。
优化方案一:条件分组+slice_max(推荐)
无需拆分数据集再合并,通过条件分组实现逻辑统一,代码更简洁且扩展性强:
final_pairing <- int_prob_final_pairing %>% # 仅对目标组合按指定字段分组,其他记录按行号单独分组(等价于不分组) group_by( across( c(PAIRING_POSITION, PAIRING_NO, DEPARTING_CITY, ARRIVAL_CITY, SCHED_DEPARTURE_DATE, SCHED_DEPARTURE_TIME, PAIRING_DATE), ~ if (EQUIPMENT == "717" & CREW_INDICATOR == "P") . else as.character(row_number()) ) ) %>% # 目标组合取最新1条,其他组合保留所有记录;with_ties=FALSE可移除同时间的重复记录,按需调整 slice_max(updated_dt, n = 1, with_ties = FALSE) %>% ungroup()
优化方案二:ifelse分组+filter
如果更习惯用filter逻辑,也可以用以下写法:
final_pairing <- int_prob_final_pairing %>% group_by( # 生成临时分组键:目标组合用指定字段拼接,其他用行号 temp_group = ifelse( EQUIPMENT == "717" & CREW_INDICATOR == "P", paste(PAIRING_POSITION, PAIRING_NO, DEPARTING_CITY, ARRIVAL_CITY, SCHED_DEPARTURE_DATE, SCHED_DEPARTURE_TIME, PAIRING_DATE), as.character(row_number()) ) ) %>% filter( ifelse( EQUIPMENT == "717" & CREW_INDICATOR == "P", updated_dt == max(updated_dt), TRUE ) ) %>% ungroup() %>% select(-temp_group) # 移除临时分组列
关键优化点
- 避免拆分合并:不用多次
filter生成子集再rbind,减少代码冗余和数据复制开销 - 扩展性强:后续新增特殊处理的机组-机型组合时,只需修改条件判断(比如用
case_when扩展多场景) - 性能更优:
slice_max是dplyr专门为取最大/最小记录设计的函数,比filter(updated_dt == max(updated_dt))效率更高,尤其是大数据量场景
扩展示例(新增其他特殊组合)
如果需要同时处理**737机型+乘务员(FA)**的分组取最新,只需修改case_when扩展条件:
final_pairing <- int_prob_final_pairing %>% group_by( across( c(PAIRING_POSITION, PAIRING_NO, DEPARTING_CITY, ARRIVAL_CITY, SCHED_DEPARTURE_DATE, SCHED_DEPARTURE_TIME, PAIRING_DATE), ~ case_when( EQUIPMENT == "717" & CREW_INDICATOR == "P" ~ ., EQUIPMENT == "737" & CREW_INDICATOR == "FA" ~ ., TRUE ~ as.character(row_number()) ) ) ) %>% slice_max(updated_dt, n = 1, with_ties = FALSE) %>% ungroup()
内容的提问来源于stack exchange,提问作者Eizy
相关产品推荐
相关产品推荐

