2016-06-08 2 views
0

Ich bin neu in R und kämpfe mit etwas, das vielleicht nicht einmal richtig gefragt wird, aber so könnte ich es in diesem Moment am besten artikulieren. Ich habe zwei verschiedene CSV-Dateien in R gelesen. enthält 481242 Zeilen und 71 Spalten (d. H. Variablen), von denen einer das Conm ist (d. H. Firmenname). dataB1 enthält 1615 Zeilen für 7 Spalten (Variablen). Eine davon ist company.name.Wie überprüft man zwei String-Spalten von zwei verschiedenen Datenrahmen auf Teilvergleich in R?

Einige der 1615 Firmennamen von dataB1 stimmen teilweise oder vollständig mit einigen der 481242-Firmennamen überein (dataA1).

Mein Ziel ist, eine Spalte in dataB1 zu erstellen, wo ich 1-s für die Firmen haben werde, die auch in (teilweise oder vollständig der gleiche Name) und mit 0-s für diejenigen, die nicht gefunden werden Dort.

irgendwelche ideen wie dies zu tun?

Sie eine bessere Vorstellung zu geben, wie die Daten aussehen, hier ist die dataA1:

1-PAGE LTD 
3I GROUP PLC 
3I INFOTECH LTD 
401 HOLDINGS LTD 
4CS HOLDINGS CO LTD 
55 STATION INC 
600 GROUP PLC (THE) 
7DIGITAL GROUP PLC 

und die Spalte, die von dataB1 angepasst werden muss:

1-Page Ltd 
180 Connect Inc 
3DLabs Inc., Ltd. 
3M France 
3U Holdings AG 
4Imprint Group Plc 
724 Solutions Inc 
7days music entertainment AG 
+0

Können Sie einige Regeln/Hinweise angeben, wie Sie die Teilübereinstimmung durchführen möchten? Weil ich es nicht mal per Hand machen kann, indem ich dein Beispiel anschaue ... – digEmAll

+0

was ich mit partiellem Matching meine, ist, dass Firmen mit ähnlichen, aber nicht genau den gleichen Namen gekoppelt werden sollten. Zum Beispiel ist die Holdings LTD and Holdings AG im Grunde die gleiche Firma, aber eine mit der deutschen Version ihres Namens (AG = Ltd). Da sich der Hauptteil ihres Namens überschneidet, sollten sie als übereinstimmendes Paar identifiziert werden. kann es einen Weg geben, den Prozentsatz einer Überlappung zu bestimmen, um sie als übereinstimmendes Paar zu deklarieren (z. B. 80% oder mehr). es hängt von einer Technik ab. Ich habe 80% Fuzzy-Lookup-Match verwendet, um diese Aufgabe auszuführen. nur Problem ist die Größe eines Daten zu groß für Excel – Maiko

Antwort

0

Ich habe keine genug Detail, aber ich würde überlegen, eine Flag-Operation zu verwenden. Ein Flag Operator identifiziert nur die in einem Vektorwert sind in einem entsprechenden Datenrahmen, Vektor, etc. Für Ihr Beispiel, das ich so etwas tun würde:

dataB1 <- toupper(dataB1) 
flag <- dataB1 %in% dataA1 

Dieser Code wird ein TRUE geben, wenn ein Wert ist voll in dataA1 und einem FALSE anderenfalls in der Form eines Vektors zugeordnet.

+0

Danke akash87. Das hört sich gut an und wird definitiv für ähnliche Aufgaben nützlich sein. Dies ergibt jedoch TRUE, wenn der Wert vollständig übereinstimmt. in meinem Fall brauche ich teilweise Übereinstimmung. zum Beispiel, wenn Firmen denselben Namen aber mit "ltd." oder "ltd" am ende oder so etwas wie "1-page ltd" versus "one-page ltd" usw. diese müssen auch identifiziert werden. Ich führte diese Aufgabe zur Zeit mit Excel Fuzzy-Lookup-Add-on. Das funktionierte gut, aber da die Daten ziemlich groß sind, musste ich sie in mehrere kleinere Teile aufteilen. wäre schön gewesen, ähnliches Werkzeug in R zu haben – Maiko

0

Sie könnten amatch Funktion des Pakets stringdist, z. :

library(stringdist) 

toSearch <- c("1-PAGE LTD","3I GROUP PLC","3I INFOTECH LTD","401 HOLDINGS LTD", 
       "4CS HOLDINGS CO LTD", "55 STATION INC","600 GROUP PLC (THE)", 
       "7DIGITAL GROUP PLC") 

lookupTable <- c("1-Page Ltd", "180 Connect Inc", "3DLabs Inc., Ltd.", 
       "3M France","3U Holdings AG", "4Imprint Group Plc", "724 Solutions Inc", 
       "7days music entertainment AG") 

acceptableDistanceThresh = 0.23 
lookupTableIndex <- amatch(toupper(toSearch), 
          toupper(lookupTable), 
          method='jw', 
          maxDist=acceptableDistanceThresh, 
          nthread = 4) 


res <- data.frame(toSearch, 
        lookupTableValue=lookupTable[res], 
        lookupTableIndex=lookupTableIndex) 

> res 
       toSearch lookupTableValue lookupTableIndex 
1   1-PAGE LTD   1-Page Ltd    1 
2  3I GROUP PLC    <NA>    NA 
3  3I INFOTECH LTD    <NA>    NA 
4 401 HOLDINGS LTD  3U Holdings AG    5 
5 4CS HOLDINGS CO LTD    <NA>    NA 
6  55 STATION INC    <NA>    NA 
7 600 GROUP PLC (THE)    <NA>    NA 
8 7DIGITAL GROUP PLC 4Imprint Group Plc    6 

In Basispaket gibt es die Funktion agrep Teilanpassung durchführen können, aber es ist nicht vektorisiert und nicht multithreaded.