Wie kann ich mit fuzzy-match-strings aus zwei datasets?
Habe ich gearbeitet, auf eine Weise zu verbinden zwei Datensätze basiert auf einem unvollkommenen string, wie ein name einer Firma. In der Vergangenheit musste ich mit zwei sehr schmutzig Listen, eine Liste hatte, Namen und finanziellen Informationen, die andere Liste hatte Namen und Adresse. Weder hatte eindeutige IDs, die entsprechend auf! DAVON AUSGEHEN, DASS DIE REINIGUNG BEREITS ANGEWENDET WURDE UND ES VIELLEICHT TIPPFEHLER UND EINFÜGUNGEN.
Bisher AGREP ist das nächste tool, das ich gefunden habe, die funktionieren könnte. Ich kann verwenden Sie die levenshtein-Distanzen in den AGREP-Paket, das Messen der Anzahl von Deletionen, Insertionen und Substitutionen zwischen zwei Zeichenketten. AGREP zurückkehren wird der string mit dem kleinsten Abstand (den meisten ähnlich).
Aber ich habe schon Schwierigkeiten haben, drehen Sie diesen Befehl auf einen einzelnen Wert anwenden, um einen ganzen Daten-frame. Ich habe grob verwendet eine for-Schleife zu wiederholen, AGREP-Funktion, aber es muss einen einfacheren Weg.
Finden Sie den folgenden code:
a<-data.frame(name=c('Ace Co','Bayes', 'asd', 'Bcy', 'Baes', 'Bays'),price=c(10,13,2,1,15,1))
b<-data.frame(name=c('Ace Co.','Bayes Inc.','asdf'),qty=c(9,99,10))
for (i in 1:6){
a$x[i] = agrep(a$name[i], b$name, value = TRUE, max = list(del = 0.2, ins = 0.3, sub = 0.4))
a$Y[i] = agrep(a$name[i], b$name, value = FALSE, max = list(del = 0.2, ins = 0.3, sub = 0.4))
}
- Basierend auf alle feedback und einige stochern von mir, ich habe eine Funktion, die lösen mein problem genauer. Code kann hier gefunden werden: github.com/Adamishere/Fuzzymatching/blob/master/...
- danke, dass Sie diese Funktion. Dies ist ganz nützlich. Jedoch bin ich nicht in der Lage, meine Spalte in string1, string2 und id2. Meine Daten werden in Daten.Tabelle also nicht sicher, wie soll ich Ihnen übergeben, wenn Sie die Funktion aufrufen. Könnten Sie bitte vorschlagen. Sorry, wenn meine Frage sehr basic, ich habe angefangen zu lernen, dass R und noch einen langen Weg zu gehen
- Ich würde nur die Daten verwenden.Rahmen(), dann einmal das Spiel fertig ist, konvertieren Sie die Daten.Tabelle()
- die fuzzyjoin-Paket könnte helfen - siehe Antwort unten mit fuzzyjoin::stringdist_left_join
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung hängt von der gewünschten Kardinalität von Ihr passendes
a
zub
. Wenn es eins-zu-eins, erhalten Sie die nächsten drei Spiele oben. Wenn es viele-zu-eins, Sie erhalten sechs.Eins-zu-eins-Fall (erfordert Zuordnung Algorithmus):
Wenn ich habe, um dies zu tun, bevor ich es zu behandeln, als eine Abtretung problem mit einer Distanz-matrix und eine Zuordnung Heuristik (greedy-Zuordnung unten). Wenn Sie möchten, eine "optimale" Lösung, Sie wären besser dran mit
optim
.Nicht vertraut mit AGREP aber hier ist Beispiel mit
stringdist
für Ihre Distanz-matrix.Produziert die Zuordnung:
Ich bin sicher, es gibt eine viel elegantere Art und Weise zu tun, die gierig Zuordnung Heuristik, aber die oben genannten arbeiten für mich.
Viele-zu-eins-Fall (keine Zuordnung-problem):
Erzeugt das Ergebnis:
Edit: verwenden
method="jw"
zu produzieren gewünschten Ergebnisse. Sehenhelp("stringdist-package")
?stringdist
oder?adist
mehr auf die Standard-Distanz-Metriken. Durch die Verwendung dieser Funktionen mit default-Argumenten "Bayes" ist ein Bearbeiten näher an "asdf" als es ist "Bayes-Inc."d <- d[d$dist < 0.2,]
. Nach der Ausführung den code von oben (ohne filter) für eine Probe, können Sie in der Regel wählen Sie eine rohe cutoff-Punkt, jenseits dessen die vorgeschlagenen Spiele sind unwahrscheinlich, nützlich zu sein.Hier ist eine Lösung mit der
fuzzyjoin
Paket. Es nutztdplyr
-wie syntax undstringdist
als eine der möglichen Arten von fuzzy-matching.Als vorgeschlagen von C8H10N4O2, die
stringdist
method="jw" schafft die besten Spiele für dein Beispiel.Als vorgeschlagen von dgrtwo, die Entwickler von fuzzyjoin, habe ich eine große max_dist und dann
dplyr::group_by
unddplyr::top_n
bekommen nur die beste übereinstimmung mit minimalem Abstand.Ich bin nicht sicher, ob dies eine sinnvolle Richtung für Sie, John Andrews, aber es gibt Ihnen ein weiteres tool (von der
RecordLinkage
- Paket) und helfen könnte.Vereinbart mit den oben Antwort "Nicht vertraut mit AGREP aber hier ist Beispiel mit stringdist für Ihre Distanz-matrix." aber add-on die Signatur-Funktion, wie unten aus Das Zusammenführen von Daten-Sets, Basierend auf Teilweise Übereinstimmenden Daten-Elemente wird genauer sein, da die Berechnung der LV basiert auf position/Ergänzung/Löschung
Benutze ich
lapply
für jene Umstände:dann schreiben Sie es als csv-es ist nicht so einfach:
Hier ist was ich für immer, wie viele Male ein Unternehmen wird in einer Liste, obwohl die Firma Namen sind ungenau Spiele,
Schritt.1 Installieren phonics-Paket
Schritt.2 erstellen Sie eine neue Spalte namens "soundexcodes" in "mylistofcompanynames"
Schritt.3 Verwenden soundex-Funktion zurück soundex-codes der Firmennamen in "soundexcodes"
Schritt.4 Kopieren Sie den Firmennamen UND die entsprechenden soundex-code in eine neue Datei (2 Spalten namens "companynames" und "soundexcode"), genannt "companysoundexcodestrainingfile"
Schritt.5 Entfernen Sie Duplikate von soundexcodes in "companysoundexcodestrainingfile"
Schritt.6 Gehen Sie durch die Liste der übrigen Firmennamen und die Namen ändern, wie Sie wollen es erscheinen in Ihrer ursprünglichen Firma
Beispiel:
Amazon Inc A625 kann Amazon A625
Accenture Limited A455 werden kann Accenture A455
Schritt.6 Führen Sie eine left_join oder (einfache SVERWEIS) zwischen companysoundexcodestrainingfile$soundexcodes und mylistofcompanynames$soundexcodes von "soundexcodes"
Schritt.7 Das Ergebnis sollte die ursprüngliche Liste mit der neuen Spalte mit der Bezeichnung "co.y", die den Namen des Unternehmens, die Art und Weise Sie es verlassen haben, in der Trainings-Datei.
Schritt.8 Art "co.y" und prüfen, ob die meisten den Namen des Unternehmens abgestimmt sind richtig,wenn ja, ersetzen Sie den alten Firmennamen mit den neuen gegeben durch SVERWEIS-von der soundex-code.