【发布时间】:2014-12-11 21:47:52
【问题描述】:
我一直在研究一种基于不完美字符串(例如公司名称)连接两个数据集的方法。过去我必须匹配两个非常脏的列表,一个列表包含姓名和财务信息,另一个列表包含姓名和地址。两者都没有可匹配的唯一 ID! 假设已经进行了清洁,可能有错别字和插入。
到目前为止,AGREP 是我发现的最接近的工具。我可以在 AGREP 包中使用 levenshtein 距离,它测量两个字符串之间的删除、插入和替换的数量。 AGREP 将返回距离最小(最相似)的字符串。
但是,我一直无法将此命令从单个值应用到整个数据框。我粗略地使用了一个 for 循环来重复 AGREP 函数,但一定有更简单的方法。
见以下代码:
a<-data.frame(name=c('Ace Co','Bayes', 'asd', 'Bcy', 'Baes', 'Bays'),price=c(10,13,2,1,15,1))
b<-data.frame(name=c('Ace Co.','Bayes Inc.','asdf'),qty=c(9,99,10))
for (i in 1:6){
a$x[i] = agrep(a$name[i], b$name, value = TRUE, max = list(del = 0.2, ins = 0.3, sub = 0.4))
a$Y[i] = agrep(a$name[i], b$name, value = FALSE, max = list(del = 0.2, ins = 0.3, sub = 0.4))
}
【问题讨论】:
-
根据大家的反馈和我的一些意见,我创建了一个函数来解决我的确切问题。代码可以在这里找到:github.com/Adamishere/Fuzzymatching/blob/master/…
-
感谢这个功能。这非常有用。但是我无法在 string1、string2 和 id2 中传递我的列。我的数据在 data.table 中,所以不确定调用函数时应该如何传递它们。你能建议一下吗?抱歉,如果我的问题非常基础,我已经开始学习 R,还有很长的路要走
-
我只会使用data.frame(),然后一旦匹配完成,转换为data.table()
-
fuzzyjoin 包可能会有所帮助 - 请参阅下面的答案,使用fuzzyjoin::stringdist_left_join
-
如果没有简单的 1 变量数据框,该函数如何工作?当我有 2 个数据框,每个数据框有多个列时,它在我的情况下不起作用。
标签: r string-matching fuzzy-search fuzzy-comparison