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

R语言数据处理:相似厂商名称归一化与非目标厂商归类求助

解决方案

核心思路

用正则表达式模糊匹配替代精确字符串替换,同时新建归一化列保留原数据,最后统一归类非目标厂商为OTHER。

完整代码实现

library(stringr)
library(dplyr) # 用case_when更简洁,也可替换为base R的ifelse

# 复现原始数据
mfg <- c("Ford Motor Company", "Ford Co.", "FoMoCo.", "Tesla", "Tesla Inc.", "Toyota", "Toyota of Jpn", "Honda Motors", "Honda Motors (Japan) Co., Ltd." )
sales <- c(12, 14, 5, 50, 20, 30, 22, 50, 11)
df <- data.frame(mfg, sales)

# 新建归一化列,不修改原数据
df$mfg_normalized <- df$mfg

# 归一化Ford所有变体:忽略大小写,匹配包含Ford/FoMoCo的任意字符串
df$mfg_normalized <- str_replace_all(df$mfg_normalized, regex("(?i)(ford|fomoco).*"), "Ford")

# 归一化Tesla所有变体
df$mfg_normalized <- str_replace_all(df$mfg_normalized, regex("(?i)tesla.*"), "Tesla")

# 将非Ford/Tesla的厂商归类为OTHER
df$mfg_normalized <- case_when(
  df$mfg_normalized == "Ford" ~ "Ford",
  df$mfg_normalized == "Tesla" ~ "Tesla",
  TRUE ~ "OTHER"
)

# 查看结果
print(df)

关键说明

  1. 原方法无效原因:str_replace_all传入字符向量时是精确匹配整个字符串,只有完全匹配的条目才会被替换。像"Honda Motors (Japan) Co., Ltd."不在替换列表中,自然不会被处理;若出现新的Ford变体(如"Ford USA"),原方法也无法覆盖。
  2. 模糊匹配优势:regex("(?i)(ford|fomoco).*")的作用:
    • (?i):忽略大小写,兼容"FORD"、"Ford"等写法
    • (ford|fomoco):匹配任意一个目标关键词
    • .*:匹配关键词后的任意字符,不管后缀、地区信息都能统一替换
  3. 保留原数据:通过新建mfg_normalized列,完全保留原始mfg列信息,避免误修改。
  4. 可复用优化:可将步骤封装成函数,每周直接调用处理新数据:
normalize_mfg <- function(data) {
  data$mfg_normalized <- data$mfg
  data$mfg_normalized <- str_replace_all(data$mfg_normalized, regex("(?i)(ford|fomoco).*"), "Ford")
  data$mfg_normalized <- str_replace_all(data$mfg_normalized, regex("(?i)tesla.*"), "Tesla")
  data$mfg_normalized <- case_when(
    data$mfg_normalized == "Ford" ~ "Ford",
    data$mfg_normalized == "Tesla" ~ "Tesla",
    TRUE ~ "OTHER"
  )
  return(data)
}

# 每周处理新数据时直接调用
new_df <- normalize_mfg(new_raw_data)

内容的提问来源于stack exchange,提问作者JensenDKMG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:59:52