2017-06-27 4 views
1

Diese Art von geholfen zu replizieren: How to do vlookup in Runter Verwendung des in R Merge Vlookup

Problem: Ich habe eine Liste von Maschinennummern in der Datenbank und dass die Notwendigkeit, eine Maschinengeschwindigkeit mit ihnen (z $ 20.00) zugeordnet hat. In einer CSV-Datei (machine_rates.csv) habe ich eine Liste dieser Maschinennummern mit der zugehörigen Maschinenrate (Spalten A & B).

Ich habe versucht, mit MERGE für diese, aber aus irgendeinem Grund schafft es eine Menge von NA's über den Datenrahmen, obwohl ich die all.x = TRUE habe. Es sieht fast so aus, als ob eine Maschine # für diese Zeile nicht angezeigt wird und die ganze Zeile in NA verwandelt wird. Das führt mich dazu zu glauben, dass ich die MERGE Funktion nicht richtig verstehe (lies viele Beiträge durch, die versuchen, das Äquivalent eines vlookup in R zu finden).

Also hier unten, habe ich versucht, einen neuen Datenrahmen durch die Zusammenführung zu erstellen, aber beim Zusammenführen, wie sagen Sie es eine neue Spalte zu erstellen, um diese merged Maschinenraten zu setzen?

dBase = dbReadTable(conn, "Mfng_Data") 
mBase = read.csv("Machine_Rates.csv") 

dBase2 = merge(dBase, mBase, by.x = "machine_number", by.y = "machine_number", 
       all.x = TRUE) 

Edit:
Gibt es eine Möglichkeit, um alle Elemente sehen und zu erhalten? dBase enthält etwa eine Million Datensätze (etwa 1 m Zeilen x 70 c Matrix). Also, wenn es 150 verschiedene Maschinentarife gibt, müsste ich all diese auflisten oder ist es möglich, diese Werte in der CSV zu "indexieren", indem man die Maschinennummer in mBase mit der Maschinennummer in dBase abgleicht?

Antwort

2

Eine dplyr Lösung.

library(dplyr) 
dbase <- data.frame(machine_number = c("10","20","30","10","10","50"), 
       second_attribute=c("a","b","c","c","a","d")) 
mbase <- data.frame(machine_number = c("10","20","30","40","50","60","70","80","90","100"), 
        rate=c(22,22,25,17,15,15,55,12,15,19)) 

left_join(dbase, mbase, by = "machine_number") 

    machine_number second_attribute rate 
1    10    a 22 
2    20    b 22 
3    30    c 25 
4    10    c 22 
5    10    a 22 
6    50    d 15 
+0

Entschuldigung, ich will nicht ein Schmerz sein, aber wenn ich die referenzierte SO-Post unten verstehe, muss ich Subdatenrahmen aus dem Hauptdatenrahmen erstellen? So etwas wie folgt aus: 'dBase1 = data.frame (machine_number) mBase1 = data.frame (machine_number) dBaseNew = merge (x = dBase1, y = mBase1, durch = "machine_number", alle.x = TRUE) ' Dann sollte dies eine neue" dBase "geben mit 1 mehr Spalte zeigt die Maschine Preise pro Maschinennummer, richtig? –

+1

Die dbase und mbase data.frames müssen nur eine gemeinsame Spalte haben; in Ihrem Fall wäre es 'machine_name'. Sie können so viele andere Informationsspalten haben, wie Sie möchten. Dann hätten Sie 'mymerged_df <- left_join (dbase, mbase, by =" machine_number ")'. Sie können zuerst alle Spalten aus 'mbase' entfernen, mit Ausnahme von' machine_name' und was auch immer die 'rate' Spalte vor dem Join aufgerufen wird. – akaDrHouse

0

Wenn Sie versuchen, das Äquivalent eines inneren Joins auszuführen, entfernen Sie das Argument all.x. Es sieht so aus, als ob du nach einer linken Verbindung suchst, was du bereits versucht hast. Überprüfen Sie Ihre Mfing_data. Sie könnten die Quelle dieser mysteriösen NAs sein. Wenn die Zusammenführungsspalte in jedem Datenrahmen denselben Namen hat, können Sie auch das Argument by weglassen.

dbase<-data.frame(machine_number=c("10","20","10","30","25"),stringsAsFactors = F) 

mbase<-data.frame(machine_number=c("10","20","30","40"),machine_rate=c(32,65,12,22), stringsAsFactors = F) 

merge(dbase,mbase,all.x = T) 


    machine_number machine_rate 
1    10   32 
2    10   32 
3    20   65 
4    25   NA 
5    30   12 
0

Eine weitere Option, wenn Sie nur eine begrenzte Anzahl von Elementen haben, die Sie abgleichen möchten.

dbase <- data.frame(machine_number = c("10","20","30","10","10","50"), 
       second_attribute=c("a","b","c","c","a","d")) 

Beachten Sie, dass bei dieser Methode die Maschinennummer nicht mehr als Nummer definiert ist.

Sie können einen kleinen Nachschlag-Vektor wie folgt definieren:

lookup <- c("10"=22, "20"=22, "30"=25, "50"=15) 

Dann können Sie direkt in den Werten zu Ihrem ersten Datenrahmen hinzufügen, mit dem folgenden:

dbase$rate <- sapply(dbase[,1], function(x) unname(lookup[x])) 
dbase 
    machine_number second_attribute rate 
1    10    a 22 
2    20    b 22 
3    30    c 25 
4    10    c 22 
5    10    a 22 
6    50    d 15 

Die sapply nimmt die erste Spalte von dbase und führt die Suche nach dem von uns definierten Objekt lookup durch.

+0

Gibt es einen Weg, um alle Artikel heraus zu finden? dBase ist eine, die etwa eine Million Datensätze enthält (etwa 1 m Zeilen x 70 c Matrix). Also, wenn es 150 verschiedene Maschinentarife gibt, müsste ich all diese auflisten oder ist es möglich, diese Werte in der CSV zu "indexieren", indem man die Maschinennummer in mBase mit der Maschinennummer in dBase abgleicht? –

+0

Ich würde gerade in der Maschinenrate .csv einlesen und die dplyr-Lösung machen. Dies ist mehr eine einmalige für einfache schnelle Suche. Beachten Sie, dass, wenn der Computername nicht identisch benannt ist, Sie 'by =" machine_name "' durch 'by = c (" machine_name "=" mach. Name ") ersetzen können' Oder um auf Basis R-Lösungen zu erweitern, die @alaybourne erwähnt, siehe https://StackOverflow.com/a/1300618/4001897 – akaDrHouse

Verwandte Themen