不完全字符串匹配

5

假设我有两列名字。第一列中的所有名字都在第二列中,但是以随机顺序出现,并且其中一些不完全匹配。因此,在一列中可能会出现John Smith的姓名,在第二列中可能会出现John_smith或JonSmith的姓名。是否有一种相对简单的R方法来执行“最佳匹配”?


如果您有比名字和姓氏更多的列(例如,您还有出生日期和地址等其他信息),并且想要查找可能匹配的行,请查看RecordLinkage软件包。http://cran.r-project.org/web/packages/RecordLinkage/index.html - Richie Cotton
1个回答

10

假设有这样的数据:

df<-data.frame(x=c('john doe','john smith','sally struthers'),y=c('John Smith','John_smith','JonSmith'))

你可以通过使用几个 gsubtolower 来实现很多功能:

df$y.fix <- gsub('[[:punct:]]', ' ', df$y)
df$y.fix <- gsub(' ', '', df$y.fix)
df$y.fix <- tolower(df$y.fix)
df$x.fix <- tolower(gsub(' ', '', df$x))

那么你将需要使用agrep:

> agrep(df$x.fix[2], df$y.fix)
[1] 1 2 3

对于更加复杂和令人困惑的字符串,请查看上周这篇文章


tolower()gsub() 进行 +1 处理,以避免在 levenshtein 距离计算中过度计数。 - Brandon Bertelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接