如何编写Stringr正则实现任意顺序字符串匹配以完成R数据框特征列生成
解决方案
一、原始正则问题修复
你的原有正则使用了.*贪心匹配逻辑,会跨逗号匹配到其他分句的DMG/WEAR,因此文本顺序变化时会出现误匹配。
修复方案:把.*替换为[^,]*,限制匹配范围不跨逗号,仅匹配FWD FNDR所在分句内的内容,修改后正则为:
pattern <- "FWD FE?ND[^,]*(WEAR|DMG)"
用你修改顺序后的测试集验证,返回结果为[1] TRUE TRUE FALSE FALSE TRUE FALSE,完全符合预期。
二、复杂业务场景实现
实现思路
- 先合并所有备注列的内容,解决操作人员填错列的匹配问题
- 统一定义规则映射表,批量生成目标列,适配大数据量的高效处理,后续新增规则只需修改规则表即可,无需改动逻辑代码
实现代码
首先加载依赖包:
library(tidyverse)
构造规则映射表,所有匹配规则统一管理:
match_rules <- tribble( ~col_name, ~pattern, "fwd_fender_mech_dmg", "FWD FE?ND[^,]*(WEAR|DMG)", "rear_axel_mech_dmg", "(CRACK|WEAR)", "rear_axel_corrosion", "CORR(O?SION)?", "computer_electrical", "ELEC FAULT", "mid_body_chass_mech_dmg", "(MID BODY CHASS|WEAR|DMG|CORR|CRACK)" )
批量处理生成目标数据框:
# 合并所有备注列内容 df_process <- df %>% unite("full_note", ends_with("_note"), sep = ",", remove = F) # 批量生成所有标记列 df2 <- map_dfc(match_rules$col_name, function(cur_col) { tibble(!!sym(cur_col) := as.integer(str_detect(df_process$full_note, match_rules$pattern[match_rules$col_name == cur_col]))) }) %>% bind_cols(df_process %>% select(SN), .)
输出的df2和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者joerminer
相关产品推荐
相关产品推荐

