Несовершенное соответствие строк - PullRequest
5 голосов
/ 08 февраля 2012

Скажем, у меня есть два столбца имен.Все имена в первом столбце находятся во втором столбце, но в случайном порядке, И некоторые из них не являются идеальными совпадениями.Так что, возможно, в одной колонке есть имя Джон Смит, а во второй Джон_смит или ДжонСмит.Есть ли какой-нибудь довольно простой способ выполнить "лучший матч"?

1 Ответ

10 голосов
/ 08 февраля 2012

Учитывая некоторые данные, подобные этому:

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

для более сложных запутанных строк, смотрите это сообщение с прошлой недели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...