我想知道在dplyr中进行连接之前是否有一种比较列的简单方法 . 以下是两个简单的数据帧 . 我想根据名字和姓氏进行全面加入,但是有一些拼写错误或不同格式,例如“Elizabeth Ray”和“Elizabeth” .
我想在加入之前比较这些列 . 我希望有一种方法可以产生一个列表或向量,包含索引的所有差异,所以我可以在加入之前纠正它们 .
如果有一种更简单的方法,我也会对此持开放态度,但我希望有最简单的方法 . 我想要一个基于dplyr,tidyr和stringr的解决方案 .
FirstNames<-c("Chris","Doug","Shintaro","Bubbles","Elsa")
LastNames<-c("MacDougall","Shapiro","Yamazaki","Murphy","Elizabeth Ray")
Pets<-c("Cat","Dog","Cat","Dog","Cat")
Names1<-data.frame(FirstNames,LastNames,Pets)
FirstNames2<-c("Chris","Doug","Shintaro","Bubbles","Elsa")
LastNames2<-c("MacDougal","Shapiro","Yamazaku","Murphy","Elizabeth")
Dwelling<-c("House","House","Apartment","Condo","House")
Names2<-data.frame(FirstNames2,LastNames2,Dwelling)
3 回答
为了比较您的记录之间的相似性,我想您可能正在寻找一种方法来将一定量的模糊逻辑匹配应用于您的名称比较任务 . AKA:在执行Record Linkage任务时应用String Distance Function . (如果你已经知道这一切,请原谅我 - 但这些关键词在开始时对我有很大的帮助 . )
有一个名为stringdist的优秀软件包可以很好地用于这些应用程序,但recordlinkage可能会帮助您最快地完成对齐数据框架的工作 .
如果您希望查看最不同的名字和名字最相似的值,您可以使用如下代码:
dplyr非常直观,但
compare.linkage()
函数可以使用一些解释 .前两个参数是显而易见的:您要比较的两个数据帧(dataframe1和dataframe2) . [如果您只想将onedataframe内的记录与自身进行比较(重复记录集记录集),则可以使用
compare.dedup()
,而只引用一个数据帧 .在这种情况下,将
blockfld
设置为1或2将分别指定First Name或Last Name上的匹配项必须为100% . 相反,您可能希望在数据集中包含主/外键并在blckfld参数中引用该列 . 或者,如果您的记录实际上并非如此等效构建,则可以完全保留此参数(默认为FALSE
),然后将比较所有可能的组合[数据帧的叉积] .strcmp
到TRUE
获取应用于您正在比较的数据列的字符串距离距离函数;如果你把它假,那么它只是测试精确的1:1字符串对应 .exclude
也是避免构建中间数据帧并仅选择您希望彼此比较的列的好方法:排除3
只是允许我们从结果中删除Pets和Dwelling比较 .上面代码中的4列,键控数据帧(不是原始问题3列数据帧)产生的结果如下:
上面的每个部分(例如$ pair)都是它自己的数据框 . 添加一个键,您可以将它们连接在一起,然后引用并使用成对的df作为切换级别门,然后甚至将data1值复制到data2帧中,例如,当您在配对等级中具有> 0.95的值时 . (注意:is_match看起来很重要,但是它用于训练匹配工具,并且与我们的任务无关 . )
在任何情况下,我希望你发现这些图书馆能够突然增加你的工作量,就像我第一次遇到它们时一样令人头疼 .
顺便说一句:我还发现这个Comparison of String Distance Algorithms对目前可用的字符串距离指标进行了很好的调查 .
我正在回答,因为我无法访问评论
试试关于代码 .
使用标准
adist()
函数作为@alistaire建议提供了一种非常有效的方法(并且可能更有可能是教师试图看到的 . )adist
的字符串度量仅限于广义的Levenshtein(编辑)距离,但这看起来确切你在寻找什么 .代码如下:(因为这看起来像是一个专门用于数据处理的R编码类的介绍,我在一些最佳实践中添加了抛光到可重现/提出的问题 . )
这种方法更简单,并且在所需的编码中更加简洁 . 我希望这对你的目的更有帮助 .