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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:24:03