我有点像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
包中的任何内容。也许这可能会更快......虽然使用ddply
或llply
函数但我有点不熟悉。
任何建议都将不胜感激。
答案 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)))
我希望这会有所帮助。