Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于地址字符串的部分匹配合并数据帧_R_Merge_String Matching_Fuzzy Comparison - Fatal编程技术网

R 基于地址字符串的部分匹配合并数据帧

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”列对这两个数据集进行子集划分,然后按照的行执行某种匹配,但得到的匹配结果是完全错误

我正在寻找一种方法来匹配两个不同的地址数据帧。两者都包含一个文本字符串(在我的示例中为“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) 
}