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
代码说明
- 拆分姓名:用
separate将Name拆分为first_name和last_name,保留原字段用于最终输出 - 生成匹配正则:使用正向预查语法,确保文件名中同时包含名和姓,不限制二者出现顺序
- 匹配关联:按行遍历每个姓名,用
str_detect筛选符合正则的文件名,再展开结果 - 整理输出:仅保留
Name和FileName列,得到与示例eg_data3一致的结果
内容的提问来源于stack exchange,提问作者Adam_S
相关产品推荐
相关产品推荐

