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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:18:01