Dies ist eine scheinbar einfache R-Frage, aber ich sehe hier keine genaue Antwort. Ich habe einen Datenrahmen (Alldata), der folgendermaßen aussieht:
Case Zip market
1 44485 0
2 44481 0
3 43210 0
Es gibt über 3,5 Millionen Datensätze.
Dann habe ich einen zweiten Datenrahmen, "Postleitzahlen".
market Zip
1 44485
1 44486
1 44488
... ... (100 zips in market 1)
2 43210
2 43211
... ... (100 zips in market 2, etc.)
Ich möchte den korrekten Wert für alldata $ market für jeden Fall zurückgeben, basierend auf alldata $ Zip, die mit dem entsprechenden Wert im PLZ-Datenrahmen übereinstimmt. Ich bin nur auf der Suche nach der richtigen Syntax, und wie üblich wird Hilfe sehr geschätzt.
Da Ihnen die market
-Spalte in alldata
nicht wichtig ist, können Sie sie zuerst entfernen und die Spalten in alldata
und zipcodes
basierend auf der Zip
-Spalte mit merge
zusammenführen und zusammenführen:
merge(alldata[, c("Case", "Zip")], zipcodes, by="Zip")
Der Parameter by
gibt die Schlüsselkriterien an. Wenn Sie also einen zusammengesetzten Schlüssel haben, können Sie etwas wie by=c("Zip", "otherfield")
tun.
Eine weitere Option, die für mich funktioniert hat und sehr einfach ist:
alldata$market<-with(zipcodes, market[match(alldata$Zip, Zip)])
Bei einem so großen Datensatz möchten Sie möglicherweise die Geschwindigkeit einer Umgebungssuche. Sie können die lookup
-Funktion aus dem qdapTools-Paket wie folgt verwenden:
library(qdapTools)
alldata$market <- lookup(alldata$Zip, zipcodes[, 2:1])
Oder
alldata$Zip %l% zipcodes[, 2:1]
Hier ist die dplyr
Methode:
library(tidyverse)
alldata %>%
select(-market) %>%
left_join(zipcodes, by="Zip")
was auf meinem Rechner ungefähr die gleiche Leistung wie lookup
hat.