2012-02-08 8 views
5

Powiedz, że mam dwie kolumny nazw. Wszystkie nazwy w pierwszej kolumnie znajdują się w drugiej kolumnie, ale w losowej kolejności, a niektóre z nich nie są idealnie dopasowane. Więc może w jednej kolumnie jest imię John Smith, a w drugim John_smith lub JonSmith. Czy istnieje dość prosty sposób na wykonanie "najlepszego meczu"?Niedoskonałe dopasowanie ciągów

+0

Jeśli masz więcej kolumn niż tylko imię i nazwisko (np. Masz datę urodzenia i adres też lub cokolwiek innego) i chcesz znaleźć wiersze, które mogą być zgodne, spójrz na pakiet 'RecordLinkage'. http://cran.r-project.org/web/packages/RecordLinkage/index.html –

Odpowiedz

10

Biorąc pod uwagę niektóre dane tak:

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

można uzyskać długą drogę z kilkoma gsub s oraz 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)) 

Następnie agrep co zechcesz:

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

dla bardziej złożonych, mylących ciągów, zobacz this post from last week.

+1

Byłeś odrobinę przed sobą. –

+0

Joris, rycerskość nie jest martwa. –

+0

+1 dla 'tolower()' i 'gsub()' out rzeczy, które w przeciwnym razie byłyby zbyt wysokie w odległościach levenshtein. –