2012-02-08 16 views
5

Dire che ho due colonne di nomi. Tutti i nomi nella prima colonna sono nella seconda colonna, ma in ordine casuale, E alcuni di loro non sono corrispondenze perfette. Quindi forse in una colonna c'è il nome John Smith e nel secondo John_smith o JonSmith. Esiste un modo abbastanza semplice per eseguire una "migliore corrispondenza"?Corrispondenza stringa imperfetta

+0

Se si dispone di più colonne oltre al solo nome e cognome (ad esempio, si dispone anche di data di nascita e indirizzo, o qualsiasi altra cosa) e si desidera trovare le righe che possono essere corrispondenti, consultare il pacchetto 'RecordLinkage'. http://cran.r-project.org/web/packages/RecordLinkage/index.html –

risposta

10

dato alcuni dati in questo modo:

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

si può ottenere una lunga strada con un paio di gsub s e 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)) 

Poi agrep è ciò che si vorrà:

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

per stringhe di confusione più complesse, vedere this post from last week.

+1

Sei stato un po 'più avanti di me. –

+0

Joris, la cavalleria non è morta. –

+0

+1 per 'tolower()' e 'gsub()' qualcosa che verrebbe sovradimensionato nelle distanze di levenshtein. –

Problemi correlati