使用agrep()模糊名称匹配更快的R代码用于多种模式......?

时间:2014-07-29 23:18:16

标签: r

我有点像R新手并且一直在尝试使用R中的agrep函数进行一些实验。我有一个庞大的客户数据库(150万行),我敢肯定有很多重复。但是,许多重复项并未使用table()显示,以获得重复精确名称的频率。只是看一些行,我注意到许多重复是“独特的”,因为在名称的拼写中有一个小错过键。

到目前为止,为了找到我的数据集中的所有重复项,我一直在使用agrep()来完成模糊名称匹配。我一直在使用agrep()中的max.distance参数来返回不同的近似匹配。我想我在回归误报和错过真正的比赛之间找到了一个愉快的媒介。由于agrep()仅限于一次匹配单个模式,因此我能够在堆栈溢出上找到一个条目,以帮助我编写一个sapply代码,该代码允许我将数据集与众多数据集匹配图案。这是我用来循环遍历众多模式的代码,因为它梳理了我的数据集中的“重复”。

dups4<-data.frame(unlist(sapply(unique$name,agrep,value=T,max.distance=.154,vf$name)))

unique$name=这是我开发的唯一索引,它包含我希望在我的数据集中搜索的所有“模式”。

vf$name= is the column in my data frame that contains all of my customer names.

此编码适用于600个左右客户的小规模样本,agrep工作正常。我的问题是当我尝试使用250K +名称的唯一索引和agrep对我的150万客户。当我输入这个问题时,代码仍然在R中运行并且尚未停止(此时我们将持续20分钟)。

有没有人有任何建议来加快速度或改进我使用过的代码?我还没有尝试过plyr包中的任何内容。也许这可能会更快......虽然使用ddplyllply函数但我有点不熟悉。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我很抱歉,我错过了发布解决方案的最后一个请求。这是我如何解决我的agrep,多模式问题,然后使用并行处理加速。

我基本上做的是获取一个完整的字符串向量,然后将它们与自己进行模糊匹配,以找出向量中是否存在任何模糊匹配的重复记录。

在这里,我创建了我希望在parSapply创建的并行进程中使用的集群(其中20个)

cl<-makeCluster(20)

因此,让我们从代码parSapply的最内层嵌套开始。这是允许我在并行进程中运行agrep()的原因。第一个参数是&#34; cl&#34;,这是我指定并行处理的集群数,如上所述。

第二个参数是我希望匹配的模式的特定向量。第三个参数是我希望用来进行匹配的实际函数(在这种情况下是agrep)。接下来的后续参数都是与我正在使用的agrep()相关的所有参数。我已经指定我想要使用value = T返回的实际字符串(而不是字符串的位置)。我还指定了我的max.distance我愿意接受模糊匹配...在这种情况下成本为2.最后一个参数是我希望与第一个模式列表匹配的完整模式列表(参数2)。当它发生时,我正在寻找重复,因此我将矢量与自身相匹配。最后的输出是一个列表,所以我使用unlist()然后数据框架它基本上得到一个匹配表。从那里,我可以轻松地运行我刚刚创建的表的频率表来查找,模糊匹配的字符串的频率大于1,最终告诉我这样的模式匹配自身和矢量中的另一个模式。

truedupevf<-data.frame(unlist(parSapply(cl,
                                     s4dupe$fuzzydob,agrep,value=T,
                                     max.distance=2,s4dupe$fuzzydob)))

我希望这会有所帮助。