Erstellen Sie eine eindeutige ID durch Fuzzy-Matching von Namen (über Zustimmung mit R)

Mit R versuche ich, die Namen von Personen in einem nach Jahr und Stadt strukturierten Datensatz abzugleichen. Aufgrund einiger Rechtschreibfehler ist keine exakte Übereinstimmung möglich. Daher versuche ich, agreep () zu verwenden, um die Namen der Übereinstimmungen zu verwischen.

Ein Beispielblock des Datensatzes ist wie folgt aufgebaut:

df <- data.frame(matrix( c("1200013","1200013","1200013","1200013","1200013","1200013","1200013","1200013",                             "1996","1996","1996","1996","2000","2000","2004","2004","AGUSTINHO FORTUNATO FILHO","ANTONIO PEREIRA NETO","FERNANDO JOSE DA COSTA","PAULO CEZAR FERREIRA DE ARAUJO","PAULO CESAR FERREIRA DE ARAUJO","SEBASTIAO BOCALOM RODRIGUES","JOAO DE ALMEIDA","PAULO CESAR FERREIRA DE ARAUJO"), ncol=3,dimnames=list(seq(1:8),c("citycode","year","candidate")) ))

Die ordentliche Version:

  citycode year                      candidate
1  1200013 1996      AGUSTINHO FORTUNATO FILHO
2  1200013 1996           ANTONIO PEREIRA NETO
3  1200013 1996         FERNANDO JOSE DA COSTA
4  1200013 1996 PAULO CEZAR FERREIRA DE ARAUJO
5  1200013 2000 PAULO CESAR FERREIRA DE ARAUJO
6  1200013 2000    SEBASTIAO BOCALOM RODRIGUES
7  1200013 2004                JOAO DE ALMEIDA
8  1200013 2004 PAULO CESAR FERREIRA DE ARAUJO

Ich möchte in jeder Stadt einzeln nachsehen, ob in mehreren Jahren Kandidaten auftauchen. Z.B. im Beispiel

PAULO CEZAR FERREIRA DE ARAUJO

PAULO CESAR FERREIRA DE ARAUJO

erscheint zweimal (mit einem Rechtschreibfehler). Jedem Kandidaten für den gesamten Datensatz sollte eine eindeutige numerische Kandidaten-ID zugewiesen werden. Der Datensatz ist ziemlich groß (5500 Städte, ca. 100.000 Einträge), daher wäre eine einigermaßen effiziente Codierung hilfreich. Anregungen zur Umsetzung?

EDIT: Hier ist mein Versuch (mit Hilfe der bisherigen Kommentare), die zur Erreichung der vorliegenden Aufgabe sehr langsam (ineffizient) ist. Anregungen zur Verbesserung?

f <- function(x) {matches <- lapply(levels(x), agrep, x=levels(x),fixed=TRUE, value=FALSE)
                  levels(x) <- levels(x)[unlist(lapply(matches, function(x) x[1]))]
                  x
                }

temp <- tapply(df$candidate, df$citycode, f, simplify=TRUE)
df$candidatenew <- unlist(temp)
df$spellerror <- ifelse(as.character(df$candidate)==as.character(df$candidatenew), 0, 1)

EDIT 2: Läuft jetzt mit guter Geschwindigkeit. Problem war der Vergleich mit vielen Faktoren bei jedem Schritt (Danke für den Hinweis, Blue Magister). Durch Reduzieren des Vergleichs auf nur die Kandidaten in einer Gruppe (d. H. Einer Stadt) wird der Befehl in 5 Sekunden für 80.000 Zeilen ausgeführt - eine Geschwindigkeit, mit der ich leben kann.

df$candidate <- as.character(df$candidate)

f <- function(x) {x <- as.factor(x)
                  matches <- lapply(levels(x), agrep, x=levels(x),fixed=TRUE, value=FALSE)
                  levels(x) <- levels(x)[unlist(lapply(matches, function(x) x[1]))]
                  as.character(x)
                }

temp <- tapply(df$candidate, df$citycode, f, simplify=TRUE)
df$candidatenew <- unlist(temp)
df$spellerror <- ifelse(as.character(df$candidate)==as.character(df$candidatenew), 0, 1)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage