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

R语言:跨数据集匹配有序姓名与无序文件名的技术问询

问题需求

现有两个数据集:

  • dataset1:包含Name字段,存储格式为固定顺序的名+姓,以单个空格分隔(如Jimbo Jones)
  • dataset2:包含FileName字段,存储pdf/docx文件路径,其中姓名顺序不定,且未必以空格分隔(可能用下划线或其他符号)

需要将两个数据集按姓名关联,返回每个Name对应的FileName。示例输入与理想输出见下方代码块,优先采用tidyverse方案。


解决方案(tidyverse实现)

核心思路是拆分姓名为独立的名、姓,生成能同时匹配名和姓(忽略顺序、分隔符)的正则表达式,再用该正则匹配文件名路径,最终关联结果。

完整代码

library(tidyverse)

# 示例数据
eg_data1 <- tibble(
  Name = c('Jeff Mills', 'Mike Banks', 'Mark Ernestus', 'Woody McBride', 'Adam Beyer', 'Cari Lekebusch'))
eg_data2 <- tibble(
  FileName = c('Y:/MyStuff/NoReally/Mine/Bio/Jeff Mills.pdf', 'Y:/MyStuff/NoReally/Mine/Bio/Banks_Mike_history.doc', 'Y:/MyStuff/NoReally/Mine/Bio/Mark_Ernestus_bio_2021.08.13.pdf', 'Y:/MyStuff/NoReally/Mine/Bio/Woody McBride yeah.pdf', 'Y:/MyStuff/NoReally/Mine/Bio/Beyer_Adam_Beyer.pdf', 'Y:/MyStuff/NoReally/Mine/Bio/Cari Lekebusch docs.pdf'))

# 处理步骤
result <- eg_data1 %>%
  # 拆分姓名为名、姓两列,保留原Name字段
  separate(Name, into = c("first_name", "last_name"), sep = " ", remove = FALSE) %>%
  # 生成正则:确保文件名同时包含名和姓,顺序不限
  mutate(name_pattern = str_glue("(?=.*{first_name})(?=.*{last_name})")) %>%
  # 按行匹配对应的文件名
  rowwise() %>%
  mutate(FileName = list(filter(eg_data2, str_detect(FileName, regex(name_pattern, ignore_case = FALSE))$FileName))) %>%
  unnest(FileName) %>%
  # 保留目标列
  select(Name, FileName)

# 查看结果
result

代码说明

  1. 拆分姓名:用separate将Name拆分为first_name和last_name,保留原字段用于最终输出
  2. 生成匹配正则:使用正向预查语法,确保文件名中同时包含名和姓,不限制二者出现顺序
  3. 匹配关联:按行遍历每个姓名,用str_detect筛选符合正则的文件名,再展开结果
  4. 整理输出:仅保留Name和FileName列,得到与示例eg_data3一致的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:22:27