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

