So führen Sie Daten in R mit R merge, dplyr oder data.table zusammen

R bietet eine Reihe schneller und eleganter Möglichkeiten, Datenrahmen durch eine gemeinsame Spalte zu verbinden. Ich möchte Ihnen drei davon zeigen:

  • Basis R's merge()Funktion,
  • dplyr's schließen sich der Funktionsfamilie an und
  • Klammersyntax von data.table.

Holen Sie sich die Daten und importieren Sie sie

In diesem Beispiel verwende ich einen meiner bevorzugten Demo-Datensätze - Flugverspätungszeiten des US Bureau of Transportation Statistics. Wenn Sie möchten , folgen, den Kopf zu //bit.ly/USFlightDelays und Herunterladen von Daten für den Zeitrahmen Ihrer Wahl mit dem Spalten Flugdatum , Reporting_Airline , Herkunft , Ziel und DepartureDelayMinutes . Rufen Sie auch die Nachschlagetabelle für Reporting_Airline ab .

Oder laden Sie diese beiden Datensätze - plus meinen R-Code in einer einzigen Datei und eine PowerPoint-Datei, in der verschiedene Arten von Datenzusammenführungen erläutert werden - hier herunter:

Herunterladen von Code, Daten und PowerPoint zum Zusammenführen von Daten in R Enthält mehrere Datendateien, ein PowerPoint- und ein R-Skript zum Artikel. Sharon Machlis

Um die Datei mit Basis R einzulesen, entpacke ich zuerst die Flugverspätungsdatei und importiere dann sowohl die Flugverspätungsdaten als auch die Codesuchdatei mit read.csv(). Wenn Sie den Code ausführen, hat die heruntergeladene Verzögerungsdatei wahrscheinlich einen anderen Namen als im folgenden Code. Beachten Sie auch die ungewöhnliche .csv_Erweiterung der Suchdatei .

entpacken ("673598238_T_ONTIME_REPORTING.zip")

mydf <- read.csv ("673598238_T_ONTIME_REPORTING.csv",

sep = ",", quote = "\" ")

mylookup <- read.csv ("L_UNIQUE_CARRIERS.csv_",

quote = "\" ", sep =", ")

Als nächstes werde ich einen Blick auf beide Dateien werfen mit head():

head (mydf) FL_DATE OP_UNIQUE_CARRIER HERKUNFT DEST DEP_DELAY_NEW X 1 2019-08-01 DL ATL DFW 31 NA 2 2019-08-01 DL DFW ATL 0 NA 3 2019-08-01 DL IAH ATL 40 NA 4 2019-08-01 DL PDX SLC 0 NA 5 01.08.2019 DL SLC PDX 0 NA 6 01.08.2019 DL DTW ATL 10 NA

head (mylookup) Code Beschreibung 1 02Q Titan Airways 2 04Q Tradewind Aviation 3 05Q Comlux Aviation, AG 4 06Q Master Top Linhas Aereas Ltd. 5 07Q Flair Airlines Ltd. 6 09Q Swift Air, LLC d / b / a Eastern Air Lines d / b / a Ost

Verschmilzt mit Basis R.

Der mydf-Verzögerungsdatenrahmen enthält nur Fluglinieninformationen per Code. Ich möchte eine Spalte mit den Namen der Fluggesellschaft von hinzufügen mylookup. Eine Basis-R-Möglichkeit, dies zu tun, ist die merge()Funktion unter Verwendung der Basissyntax merge(df1, df2). Es spielt keine Rolle, in welcher Reihenfolge Datenrahmen 1 und Datenrahmen 2 angeordnet sind, aber der erste wird als x und der zweite als y betrachtet. 

Wenn die Spalten, über die Sie beitreten möchten, nicht denselben Namen haben, müssen Sie Merge mitteilen, nach welchen Spalten Sie verbinden möchten: by.xfür den Spaltennamen des x-Datenrahmens und by.yfür die y- Spalte , z merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Sie können Merge auch mitteilen, ob alle Zeilen, einschließlich solcher ohne Übereinstimmung, oder nur Zeilen, die mit den Argumenten all.xund übereinstimmen, angezeigt werden sollen all.y. In diesem Fall möchte ich alle Zeilen aus den Verzögerungsdaten; Wenn die Nachschlagetabelle keinen Airline-Code enthält, möchte ich die Informationen trotzdem. Aber ich brauche keine Zeilen aus der Nachschlagetabelle, die nicht in den Verspätungsdaten enthalten sind (es gibt einige Codes für alte Fluggesellschaften, die dort nicht mehr fliegen). Also all.xgleich, TRUEaber all.ygleich FALSE. Vollständiger Code:

join_df <- merge (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "Code", all.x = TRUE, all.y = FALSE)

Der neue verbundene Datenrahmen enthält eine Spalte namens Beschreibung mit dem Namen der Fluggesellschaft basierend auf dem Carrier-Code.

head (join_df) OP_UNIQUE_CARRIER FL_DATE HERKUNFT DEST DEP_DELAY_NEW X Beschreibung 1 9E 2019-08-12 JFK SYR 0 NA Endeavour Air Inc. 2 9E 2019-08-12 TYS DTW 0 NA Endeavour Air Inc. 3 9E 2019-08-12 ORF LGA 0 NA Endeavour Air Inc. 4 9E 2019-08-13 IAH MSP 6 NA Endeavour Air Inc. 5 9E 2019-08-12 DTW JFK 58 NA Endeavour Air Inc. 6 9E 2019-08-12 SYR JFK 0 NA Endeavour Air Inc. .

Tritt mit dplyr bei

dplyr verwendet die SQL-Datenbanksyntax für seine Verknüpfungsfunktionen. Ein linker Join  bedeutet: Fügen Sie alles links (in was war der x-Datenrahmen merge()) und alle Zeilen ein, die mit dem rechten (y) Datenrahmen übereinstimmen. Wenn die Verknüpfungsspalten denselben Namen haben, benötigen Sie lediglich left_join(x, y). Wenn sie nicht denselben Namen haben, benötigen Sie ein byArgument wie z left_join(x, y, by = c("df1ColName" = "df2ColName")).

Beachten Sie die Syntax für by: Es handelt sich um einen benannten Vektor, bei dem sowohl der Name der linken als auch der rechten Spalte in Anführungszeichen steht.

Der Code zum Importieren und Zusammenführen beider Datensätze mit left_join()ist unten aufgeführt. Es beginnt mit dem Laden der Pakete dplyr und readr und liest dann die beiden Dateien mit ein read_csv(). Bei der Verwendung read_csv()muss ich die Datei nicht zuerst entpacken.

Bibliothek (dplyr)

Bibliothek (readr)

mytibble <- read_csv ("673598238_T_ONTIME_REPORTING.zip")

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

join_tibble <- left_join (mytibble, mylookup_tibble,

by = c ("OP_UNIQUE_CARRIER" = "Code"))

read_csv()schafft Tibbles , die eine Art von Datenrahmen mit einigen zusätzlichen Features sind. left_join()verschmilzt die beiden. Schauen Sie sich die Syntax an: In diesem Fall ist die Reihenfolge wichtig. left_join()bedeutet, alle Zeilen im linken oder ersten Datensatz einzuschließen, aber nur Zeilen, die mit dem zweiten übereinstimmen . Und da ich mich durch zwei unterschiedlich benannte Spalten verbinden muss, habe ich ein byArgument eingefügt.

Wir können die Struktur des Ergebnisses mit der glimpse()Funktion von dplyr betrachten. Dies ist eine weitere Möglichkeit, die obersten Elemente eines Datenrahmens anzuzeigen .

Blick (join_tibble) Beobachtungen: 658.461 Variablen: 7 $ FL_DATE 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01… $ OP_UNIQUE_CARRIER "DL", "DL "," DL "," DL "," DL "," DL "," DL "," DL "," DL "," DL ", ... $ ORIGIN" ATL "," DFW "," IAH "," PDX "," SLC "," DTW "," ATL "," MSP "," JF ... $ DEST "DFW", "ATL", "ATL", "SLC", "PDX", "ATL", "DTW" "," JFK "," MS ... $ DEP_DELAY_NEW 31, 0, 40, 0, 0, 10, 0, 22, 0, 0, 0, 17, 5, 2, 0, 0, 8, 0, ... $ X6 NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ... $ Beschreibung "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air…

Dieser verknüpfte Datensatz enthält jetzt eine neue Spalte mit dem Namen der Fluggesellschaft. Wenn Sie eine Version dieses Codes selbst ausführen, werden Sie wahrscheinlich feststellen, dass dplyr viel schneller als base R war.

Schauen wir uns als nächstes einen superschnellen Weg an, um Verknüpfungen herzustellen.