说我有两列名称。第一列中的所有名称都在第二列中,但是以随机顺序排列,并且其中一些不是完全匹配。因此,也许在第一栏中有约翰·史密斯的名字,在第二栏中有约翰·史密斯或乔恩·史密斯的名字。有没有执行“最佳匹配”的相当简单的R方法?

最佳答案

给定一些像这样的数据:

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


有关更复杂的令人困惑的字符串,请参见this post from last week

07-24 09:51
查看更多