R 基于地址字符串的部分匹配合并数据帧
我正在寻找一种方法来匹配两个不同的地址数据帧。两者都包含一个文本字符串(在我的示例中为“Line”列)、一个邮政编码/邮政编码类型标识符(“PC”列)和一个唯一的Ref或ID代码。我需要将生成的匹配结果放在一个新的数据帧中,格式如下:DF1$Line、DF1$PD、DF2$Line、DF2$PD、Ref、ID和一些详细说明匹配强度的数字(这基于下面的示例代码) 我的实际数据集包含数千条记录,我一直在考虑使用“PC”列对这两个数据集进行子集划分,然后按照的行执行某种匹配,但得到的匹配结果是完全错误的 这是一个与我的数据相似的组合数据集(在这些示例中,每个数据集中的行彼此对应,很遗憾,我的真实数据不是这样格式化的)R 基于地址字符串的部分匹配合并数据帧,r,merge,string-matching,fuzzy-comparison,R,Merge,String Matching,Fuzzy Comparison,我正在寻找一种方法来匹配两个不同的地址数据帧。两者都包含一个文本字符串(在我的示例中为“Line”列)、一个邮政编码/邮政编码类型标识符(“PC”列)和一个唯一的Ref或ID代码。我需要将生成的匹配结果放在一个新的数据帧中,格式如下:DF1$Line、DF1$PD、DF2$Line、DF2$PD、Ref、ID和一些详细说明匹配强度的数字(这基于下面的示例代码) 我的实际数据集包含数千条记录,我一直在考虑使用“PC”列对这两个数据集进行子集划分,然后按照的行执行某种匹配,但得到的匹配结果是完全错误
DF1这是我的基本R解决方案,如果我得到了,请告诉我
DF3 <- merge(DF1, DF2, by = "PC")
DF3[!duplicated(DF3$Ref) , ]
PC Line.x Ref Line.y ID
1 PP1 9RT 92 Parade Street, Yorky 32453 92 Street, Parade, Yorkie OYUIY
2 PP1 9TR 99 York Parade, Yorkie 23412 99 York Parade, Yorky UYTER
4 PP1 9TR 29 Road Street, Townplace 43223 99 York Parade, Yorky UYTER
6 ZZ1 4TY 64 London Street, Jasper 123451 64 London St, Jasper ABGED
9 ZZ1 4TY 46 London Road, Flat 2, Jasper 567348 64 London St, Jasper ABGED
12 ZZ1 4TY 99 Parade Road, Placename 98734 64 London St, Jasper ABGED
<代码> df3我会考虑首先使用<代码> AgRP< <代码>评估潜在匹配:
for (i in 1:length(DF1$Line)) {
matchDF1 <- agrep(pattern = DF1$Line[i], x = DF2$Line, max.distance = 0.5,
value = TRUE)
}
for(i in 1:长度(DF1$行)){
如果PC
对于每个行都是唯一的,则匹配DF1,您不需要(合并!)模糊比较。只需merge(DF1,DF2,by=“PC”)
然后按Ref
的唯一值进行子集。抱歉,我没有说得很清楚。PC不是唯一的,行列中的多个不同地址字符串可能具有相同的PC值。您是否查看了agrep
函数?谢谢。虽然Line.y只包含6个地址中的3个。我需要一个不包含这些地址的解决方案多次复制同一地址。@克里斯,很抱歉,我真的不明白你的意思。你能提供一个所需的输出吗?在我的示例中,所需的输出类似于DF1和DF2的cbind。但是,由于我的实际数据与此不同,我需要一个解决方案,该解决方案基本上可以读取行和列中的字符串d找到最接近的匹配项。我认为PC列可以用来在每行数据发生之前对数据进行子集划分,因为匹配的地址在PC字段中具有相同的值。那么,为什么不cbind
然后再进行子集划分呢?我的意思是,唯一常见的列是Line
?如果您确实需要模糊匹配,但如果不需要的话这种情况下,我们肯定缺少了另一种方式。因为我的实际数据的格式没有那么好。在实际数据集DF1中,第1行可能对应于DF第62349行。我的问题是,对于每个数据集,行列中的字符串是不同的,例如,有些数据集有不同的逗号或单词。onl保证每个DF中匹配行之间相同的是PC列。
DF3 <- merge(DF1, DF2, by = "PC")
DF3[!duplicated(DF3$Ref) , ]
PC Line.x Ref Line.y ID
1 PP1 9RT 92 Parade Street, Yorky 32453 92 Street, Parade, Yorkie OYUIY
2 PP1 9TR 99 York Parade, Yorkie 23412 99 York Parade, Yorky UYTER
4 PP1 9TR 29 Road Street, Townplace 43223 99 York Parade, Yorky UYTER
6 ZZ1 4TY 64 London Street, Jasper 123451 64 London St, Jasper ABGED
9 ZZ1 4TY 46 London Road, Flat 2, Jasper 567348 64 London St, Jasper ABGED
12 ZZ1 4TY 99 Parade Road, Placename 98734 64 London St, Jasper ABGED
for (i in 1:length(DF1$Line)) {
matchDF1 <- agrep(pattern = DF1$Line[i], x = DF2$Line, max.distance = 0.5,
value = TRUE)
}