Hur man slår samman data i R med hjälp av R merge, dplyr eller data.table

R har ett antal snabba, eleganta sätt att sammanfoga dataramar med en gemensam kolumn. Jag skulle vilja visa er tre av dem:

  • bas R: s merge()funktion,
  • dplyr går med i familjens funktioner och
  • data.tables parentes-syntax.

Hämta och importera data

I det här exemplet använder jag en av mina favorituppsättningar av demodata - flygfördröjningstider från US Bureau of Transportation Statistics. Om du vill följa med, gå till //bit.ly/USFlightDelays och ladda ner data för den tidsram du väljer med kolumnerna Flight Date , Reporting_Airline , Origin , Destination och DepartureDelayMinutes . Hämta också uppslagstabellen för Reporting_Airline .

Eller ladda ner dessa två datamängder - plus min R-kod i en enda fil och en PowerPoint som förklarar olika typer av datasammanfogningar - här:

ladda ner kod, data och PowerPoint för att slå samman data i R Inkluderar flera datafiler, ett PowerPoint- och R-skript som åtföljer artikeln. Sharon Machlis

För att läsa in filen med bas R, skulle jag först packa upp flygfördröjningsfilen och sedan importera både flygfördröjningsdata och kodsökningsfilen med read.csv(). Om du kör koden kommer fördröjningsfilen du laddade ner troligen att ha ett annat namn än i koden nedan. Observera också sökfils ovanliga .csv_tillägg.

packa upp ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

citat = "\" ", sep =", ")

Därefter tar jag en titt på båda filerna med head():

head (mydf) FL_DATE OP_UNIQUE_CARRIER ORIGIN 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 2019-08-01 DL SLC PDX 0 NA 6 2019-08-01 DL DTW ATL 10 NA

head (mylookup) Kod Beskrivning 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 östra

Fusionerar med bas R

Mydf-fördröjningsdataramen har endast flyginformation efter kod. Jag vill lägga till en kolumn med flygbolagsnamnen från mylookup. Ett grundläggande R-sätt att göra detta är med merge()funktionen, med den grundläggande syntaxen merge(df1, df2). Det spelar ingen roll ordningen på dataram 1 och dataram 2, men den som är först anses vara x och den andra är y. 

Om de kolumner du vill gå med inte har samma namn, måste du tala om för merge vilka kolumner du vill gå med: by.xför x dataramen kolumnnamn och by.yför y en, såsom merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Du kan också berätta om du vill att alla rader, inklusive sådana utan matchning, eller bara rader som matchar, med argumenten all.xoch all.y. I det här fallet vill jag ha alla rader från fördröjningsdata; om det inte finns någon flygbolagskod i uppslagstabellen vill jag fortfarande ha informationen. Men jag behöver inte rader från uppslagstabellen som inte finns i fördröjningsdata (det finns några koder för gamla flygbolag som inte flyger längre där inne). Så, är all.xlika TRUEmen all.ylika FALSE. Fullständig kod:

joined_df <- slå samman (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "Kod", all.x = SANT, all.y = FALSK)

Den nya anslutna dataramen innehåller en kolumn som heter Beskrivning med flygbolagets namn baserat på operatörskoden.

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

Går med dplyr

dplyr använder SQL-databassyntax för sina anslutningsfunktioner. En vänster koppling  betyder: Inkludera allt till vänster (vad var x dataramen i merge()) och alla rader som matchar från höger (y) dataramen. Om kopplingskolumnerna har samma namn är allt du behöver left_join(x, y). Om de inte har samma namn behöver du ett byargument, till exempel left_join(x, y, by = c("df1ColName" = "df2ColName")).

Observera syntaxen för by: Det är en namngiven vektor, med både vänster och höger kolumnnamn i citattecken.

Koden för att importera och slå samman båda datamängderna left_join()är nedan. Det börjar med att ladda dplyr- och readr-paketen och läser sedan in de två filerna med read_csv(). När read_csv()jag använder behöver jag inte packa upp filen först.

bibliotek (dplyr)

bibliotek (readr)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

joined_tibble <- left_join (mytibble, mylookup_tibble,

av = c ("OP_UNIQUE_CARRIER" = "Kod"))

read_csv()skapar tibbles , som är en typ av dataram med några extra funktioner. left_join()slår samman de två. Ta en titt på syntaxen: I det här fallet är ordning viktig. left_join()betyder inkludera alla rader till vänster eller första datauppsättningen, men endast rader som matchar från den andra . Och eftersom jag måste gå med två olika namngivna kolumner inkluderade jag ett byargument.

Vi kan titta på strukturen för resultatet med dplyrs glimpse()funktion, vilket är ett annat sätt att se de översta punkterna i en dataram.

glimt (joined_tibble) Observationer: 658 461 Variabler: 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, ... $ Beskrivning "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air ...

Den här anslutna datamängden har nu en ny kolumn med flygbolagets namn. Om du kör en version av den här koden själv kommer du antagligen att märka att dplyr var mycket snabbare än bas R.

Låt oss sedan titta på ett supersnabbt sätt att göra anslutningar.