假设我有两列名字。第一列中的所有名字都在第二列中,但是以随机顺序出现,并且其中一些不完全匹配。因此,在一列中可能会出现John Smith的姓名,在第二列中可能会出现John_smith或JonSmith的姓名。是否有一种相对简单的R方法来执行“最佳匹配”?
假设我有两列名字。第一列中的所有名字都在第二列中,但是以随机顺序出现,并且其中一些不完全匹配。因此,在一列中可能会出现John Smith的姓名,在第二列中可能会出现John_smith或JonSmith的姓名。是否有一种相对简单的R方法来执行“最佳匹配”?
假设有这样的数据:
df<-data.frame(x=c('john doe','john smith','sally struthers'),y=c('John Smith','John_smith','JonSmith'))
你可以通过使用几个 gsub
和 tolower
来实现很多功能:
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
RecordLinkage
软件包。http://cran.r-project.org/web/packages/RecordLinkage/index.html - Richie Cotton