基于字符串及子串相似性合并R语言DataFrame:匹配关键词关联ID
R语言实现子串匹配关联DataFrame
需求明确:现有两个DataFrame,search存的是格式不规范的地址语句(A列),find存的是带对应ID的城市关键词(Buzzword列)。需要在search的A列中匹配find里的关键词(支持子串匹配),把匹配到的关键词和ID关联到结果里,未匹配的标记NA。
先说明:你给的示例results里有几处错误,比如第三行的Buzzword应该是"text3"而非"toxt2",ID应为3;第四行"toxt2"不在关键词列表里,所以Buzzword和ID都得是NA;第五行无匹配项也应该保留并标记NA。
下面是两种实用的实现方法:
方法一:基础R + stringr包(适合小数据集)
先清理search里的多余空格,再逐个匹配关键词并关联ID:
library(stringr) # 清理A列的多余空格(多个空格合并为一个,首尾空格去掉) search$A <- str_squish(search$A) # 从A列中提取匹配的Buzzword search$Buzzword <- str_extract(search$A, paste(find$Buzzword, collapse = "|")) # 根据匹配到的Buzzword关联对应的ID search$ID <- find$ID[match(search$Buzzword, find$Buzzword)] # 查看最终结果 print(search)
运行后会得到正确的匹配结果,未匹配的行Buzzword和ID显示NA。
方法二:用fuzzyjoin包实现正则左连接(适合大数据集)
如果数据集较大,用fuzzyjoin的正则匹配连接会更高效简洁:
library(fuzzyjoin) library(stringr) # 先清理空格 search$A <- str_squish(search$A) # 执行正则左连接,规则是A列包含Buzzword results <- regex_left_join(search, find, by = c("A" = "Buzzword")) # 查看结果 print(results)
这个方法一步完成匹配和关联,自动保留所有search的行,匹配到的填充对应Buzzword和ID,未匹配的为NA。
正确结果示例
最终的results应该是这样的:
# A Buzzword ID # 1 This is a random example3 example3 1 # 2 This is even more radom test2 test2 2 # 3 Why would text3 this happen text3 text3 3 # 4 how can toxt2 this <NA> NA # 5 complete difference <NA> NA
内容的提问来源于stack exchange,提问作者Sulz
相关产品推荐
相关产品推荐

