我必须在给定输入字符串的一列数据框中进行软匹配,例如
col <- c("John Collingson","J Collingson","Dummy Name1","Dummy Name2")
inputText <- "J Collingson"
#Vice-Versa
inputText <- "John Collingson"
我想找回“John Collingson”和&amp; “J Collingson”来自提供的colname“col”
请帮助
答案 0 :(得分:4)
agrep
绝对是一个快速简便的基础R解决方案。如果这只是更大数据框架的玩具示例,您可能会对更耐用的工具感兴趣。在过去的一个月里,了解@PaulHiemstra所指出的Levenshtein距离(同样在these不同的questions)让我看到RecordLinkage包裹。小插曲让我想要更多关于&#34; soft&#34;的例子。或模糊&#34;比赛,尤其是超过1场比赛,但问题的基本答案可能是:
library(RecordLinkage)
col <- data.frame(names1 = c("John Collingson","J Collingson","Dummy Name1","Dummy Name2"))
inputText <- data.frame(names2 = c("J Collingson"))
g1 <- compare.linkage(inputText, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6)
# id names2 Weight
# 1 1 J Collingson
# 2 2 J Collingson 1.000
# 3
# 4 1 J Collingson
# 5 1 John Collingson 0.815
inputText2 <- data.frame(names2 = c("Jon Collinson"))
g1 <- compare.linkage(inputText2, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6)
# id names2 Weight
# 1 1 Jon Collinson
# 2 1 John Collingson 0.9644444
# 3
# 4 1 Jon Collinson
# 5 2 J Collingson 0.7924825
请从compare.linkage()或compare.dedup()开始 - 对大型数据集使用RLBigDataLinkage()或RLBigDataDedup()。希望这会有所帮助。
答案 1 :(得分:1)
agrep
似乎是您正在寻找的功能。它确实Approximate String Matching (Fuzzy Matching)
。它根据一些距离测量返回与输入模式最接近的匹配,即广义Levenshtein编辑距离。有关详细信息,请参阅?agrep
。
agrep("J Collingson", col, value = TRUE)
[1] "John Collingson" "J Collingson"