2010-02-09 9 views
9

BESCHREIBUNGzwei Daten Merging Frames Fuzzy/Ungefähre String Matching in R

Ich habe zwei Datensätze mit Informationen verwenden, die ich zusammenführen müssen. Die einzigen gemeinsamen Felder, die ich habe, sind Strings, die nicht perfekt übereinstimmen und ein numerisches Feld, das sich wesentlich unterscheiden kann.

Die einzige Möglichkeit, das Problem zu erklären, ist, Ihnen die Daten zu zeigen. Hier ist a.csv und b.csv. Ich versuche, B mit A zu verschmelzen.

Es gibt drei Felder in B und vier in A. Firmenname (nur Datei A), Fondsname, Asset-Klasse und Assets. Bisher mein Fokus war auf dem Versuch, die Fondsnamen übereinstimmen durch Wörter oder Teile der Saiten ersetzen exakte Übereinstimmungen zu erstellen und dann mit:

a <- read.table(file = "http://bertelsen.ca/R/a.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T) 
b <- read.table(file = "http://bertelsen.ca/R/b.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T) 
merge(a,b, by="Fund.Name") 

aber das bringt mich nur auf etwa 30% Matching. Den Rest muss ich von Hand machen.

Assets sind ein numerisches Feld, das in beiden nicht immer korrekt ist und stark variieren kann, wenn der Fonds über geringe Vermögenswerte verfügt. Die Asset-Klasse ist ein String-Feld, das in beiden Dateien "im Allgemeinen" identisch ist, jedoch gibt es Diskrepanzen.

auf die Komplikation Hinzufügen sind die verschiedenen Reihe von Fonds, in Datei B. Zum Beispiel:

AGF Canadian Wert

AGF kanadischen Wert D

In diesen Fällen Ich muss diejenige wählen, die nicht in der Reihe ist, oder wähle die, die "A", "-A" oder "Advisor" genannt wird, als die Übereinstimmung.

FRAGE

Was würden Sie sagen, ist der beste Ansatz? Diese Übung ist etwas, was ich monatlich machen muss, und die manuelle Anpassung ist unglaublich zeitaufwendig. Beispiele für Code wären instrumentell.

IDEAS

Eine Methode, die ich denke, arbeiten kann, ist die Saiten Normalisierung basierend auf dem ersten aktivierten Buchstaben jedes Wortes in der Zeichenkette. Aber ich war nicht in der Lage, herauszufinden, wie man das mit Hilfe von R abziehen kann. Eine andere Methode, die ich in Betracht gezogen habe, war das Erstellen eines Übereinstimmungsindex basierend auf einer Kombination aus Vermögenswerten, Fondsname, Anlageklasse und Unternehmen. Aber ich bin mir nicht sicher, wie ich das mit R machen soll. Oder, wenn es überhaupt möglich ist.

Beispiele für Code, Kommentare, Gedanken und Richtung werden sehr geschätzt!

+1

Wenn wir über String-Matching dann '? Agrep' (im Basispaket) sprechen. – Marek

+1

Wäre toll, wenn Sie die Daten Teil des Posts machen können, damit wir das Beispiel ein paar Jahre nach dem Posten verwenden können. Vielen Dank. – Jochem

+0

tatsächlich ein paar Jahre später und die Daten sind nicht da –

Antwort

2

Ungefähre String-Matching, da ein falsches Spiel keine gute Idee ist es, die gesamte Analyse würde ungültig machen. Wenn die Namen aus jeder Quelle jedes Mal gleich sind, dann scheint mir das Erstellen von Indizes die beste Option zu sein. Dies ist leicht in R getan:

Angenommen, Sie die Daten haben:

a<-data.frame(name=c('Ace','Bayes'),price=c(10,13)) 
b<-data.frame(name=c('Ace Co.','Bayes Inc.'),qty=c(9,99)) 

einen Index von Namen bauen für jede Quelle einer Zeit, vielleicht mit pmatch usw. als Ausgangspunkt und dann manuell zu validieren.

a.idx<-data.frame(name=c('Ace','Bayes'),idx=c(1,2)) 
b.idx<-data.frame(name=c('Ace Co.','Bayes Inc.'), idx=c(1,2)) 

dann für jeden laufen merge mit:

a.rich<-merge(a,a.idx,by="name") 
b.rich<-merge(b,b.idx,by="name") 
merge(a.rich,b.rich,by="idx") 

Welche uns geben:

idx name.x price  name.y qty 
1 1 Ace 10 Ace Co. 9 
2 2 Bayes 13 Bayes Inc. 99 
+2

Das Problem ist mehr, wenn die Namen dann dreckiger sind. Sagen Sie, wann das erste Wort kurz sein kann oder nicht, und ob der Rest der Wörter auch kurz sein darf oder nicht. Diese Kurzform ist in einem einzelnen Namen oder in verschiedenen Namen nicht konsistent. – Jay

7

Ein kurzer Vorschlag: Versuchen Sie, einige Übereinstimmungen in den verschiedenen Feldern separat zu machen, bevor Sie die Zusammenführung verwenden. Der einfachste Ansatz ist mit der pmatch-Funktion, obwohl R keinen Mangel an Textabgleichfunktionen hat (z. B. agrep).Hier ist ein einfaches Beispiel:

pmatch(c("med", "mod"), c("mean", "median", "mode")) 

Für Ihre Daten-Set, das passt alle Fondsnamen aus a:

> nrow(merge(a,b,x.by="Fund.Name", y.by="Fund.name")) 
[1] 58 
> length(which(!is.na(pmatch(a$Fund.Name, b$Fund.name)))) 
[1] 238 

Sobald Sie Matches erstellen, können Sie sie leicht zusammenführen können zusammen diejenigen stattdessen verwenden.

+0

Danke Shane, deine Vorschläge sind immer hilfreich - ich werde mir diese beiden ansehen und dich wissen lassen, wie es geklappt hat. –

+0

Ja definitiv, gute Tipps Shane. – Jay

+3

Das Problem ist mehr, wenn die Namen dreckiger sind als das. Sagen Sie, wann das erste Wort kurz sein kann oder nicht, und ob der Rest der Wörter auch kurz sein darf oder nicht. Diese Kurzform ist in einem einzelnen Namen oder in verschiedenen Namen nicht konsistent. – Jay

1

Ich bin auch ein kanadischer Einheimischer, erkennen die Fondsnamen.

Dies ist ein schwieriger Fall, da jeder Datenanbieter sein eigenes Formular für die einzelnen Fondsnamen auswählt. Einige verwenden unterschiedliche Strukturen wie alle in Fonds oder Klassen, andere sind überall zu finden. Jeder scheint auch seine eigenen Kurzformen zu wählen, und diese ändern sich regelmäßig.

Deshalb machen so viele Leute wie Sie das regelmäßig von Hand. Einige der Beratungsfirmen führen Indizes auf, um verschiedene Quellen zu verknüpfen, nicht sicher, ob Sie diese Route erforscht haben?

Wie Shane und Marek darauf hinwiesen, ist dies eine passende Aufgabe mehr als eine direkte Verbindung. Viele Unternehmen haben mit diesem Problem zu kämpfen. Ich bin in der Mitte meiner Arbeit an diesem ...

Jay

+0

Es ist frustrierend. Ich bin wirklich überrascht, dass ihnen keine Codes zugewiesen sind. Die Nomenklatur ist überhaupt nicht standardisiert, und selbst die Anlageklassen stimmen nicht von einem Lieferanten zum nächsten für das gleiche Jahr, geschweige denn den gleichen Monat, überein.Wenn Sie daran arbeiten, würde ich gerne eine Gelegenheit haben, es genauer zu besprechen: brandon AT bertelsen dot ca bin ich. –

+1

Definitiv ist, einige haben Codes, aber sie sind Identifizierer nur in ihren eigenen Systemen ... Ich möchte die Gelegenheit haben, zu besprechen und zusammenzuarbeiten. Ich werde Sie in Kürze von einer E-Mail abholen. – Jay

+1

Es scheint, ich kann nur meine eigene Antwort kommentieren .... so stimme ich mit jmoy überein, sollte man einen Index (id) konstruieren, um die verschiedenen Quellen zu verbinden. Der Schlüssel ist das Erstellen dieser Indizes;) einige der Standard-Funktionen funktionieren, manche nicht. Es ist schwer. Gibt es da draußen erfahrene Datenintegratoren, die vielleicht etwas wissen, was einige von uns vielleicht nicht wissen? Ungefähre Übereinstimmung und alle Umgebung, die die automatisierte Methode sind, die ich gefunden habe, um solche Probleme anzugehen. – Jay