R语言匹配另一数据框逗号分隔列表替换用户表公司名称
问题原因分析
- 参数顺序与向量长度不匹配:你写的
str_detect(company_info$company_name_other, company)中,company_info$company_name_other只有2个元素,而user$company有4个元素,R会自动循环回收短向量,导致匹配逻辑错位,才出现漏改的情况。 - 缺少正则安全规则:没有用
fixed()包裹匹配文本,万一公司名里包含.、*这类正则特殊字符,会出现意料之外的匹配结果。
推荐解决方案
最稳妥的方式是先把企业别名列拆分为一对一的映射表,再做关联匹配,逻辑清晰不容易出错:
library(tidyverse) # 示例数据 user <- data.frame(User_ID = 1:4, company = c("Ford", "Ford Motors", "Ford China", "amazon.com")) company_info <- data.frame(company_ID = 1:2, company_name = c("Ford", "Amazon"), company_name_other = c("Ford Motors, Ford China", "amazon.com, Amazon AWS")) # 1. 构造别名-标准名映射表 company_map <- company_info %>% # 按逗号+可选空格拆分别名为多行 separate_rows(company_name_other, sep = ",\\s*") %>% select(alias = company_name_other, standard_name = company_name) # 2. 关联匹配替换公司名 user_standard <- user %>% left_join(company_map, by = c("company" = "alias")) %>% # 匹配到标准名就用标准名,没匹配到保留原名 mutate(company = coalesce(standard_name, company)) %>% select(-standard_name)
运行后user_standard的company列就会全部统一为Ford和Amazon。
原有写法的调整方案
如果你不想拆表,也可以对user的每一行单独做匹配,修正原有代码:
user %>% rowwise() %>% mutate(company = { match_pos <- which(str_detect(company_info$company_name_other, fixed(company))) ifelse(length(match_pos) > 0, company_info$company_name[match_pos], company) }) %>% ungroup()
内容的提问来源于stack exchange,提问作者matt_lnrd
相关产品推荐
相关产品推荐

