2012-02-08 10 views
5

Supongamos que tengo dos columnas de nombres. Todos los nombres en la primera columna están en la segunda columna, pero en orden aleatorio, Y algunos de ellos no son coincidencias perfectas. Así que tal vez en una columna hay el nombre de John Smith y en el segundo John_smith o JonSmith. ¿Hay alguna manera R bastante simple de realizar un "mejor partido"?Coincidencia de cadena imperfecta

+0

Si tiene más columnas que solo el nombre y el apellido (por ejemplo, también tiene fecha de nacimiento y dirección, o lo que sea) y desea encontrar filas que coincidan, consulte el paquete 'RecordLinkage'. http://cran.r-project.org/web/packages/RecordLinkage/index.html –

Respuesta

10

dado algunos datos de la siguiente manera:

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

, usted puede obtener un largo camino con unos gsub s y 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)) 

Entonces agrep es lo que usted quiere:

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

para cadenas confusas más complejas, consulte this post from last week.

+1

Estabas un poco adelantado a mí. –

+0

Joris, la caballerosidad no está muerta. –

+0

+1 para 'tolower()' y 'gsub()' out cosas que de otro modo estarían sobrecontables en distancias levenshtein. –

Cuestiones relacionadas