Gegevens samenvoegen in R met R merge, dplyr of data.table

R heeft een aantal snelle, elegante manieren om gegevensframes samen te voegen via een gemeenschappelijke kolom. Ik wil je er drie laten zien:

  • basis R's merge()functie,
  • dplyr's toetreden tot een familie van functies, en
  • de beugelsyntaxis van data.table.

Haal de gegevens op en importeer ze

Voor dit voorbeeld gebruik ik een van mijn favoriete demodatasets: vluchtvertragingen van het Amerikaanse Bureau of Transportation Statistics. Als je het wilt volgen, ga dan naar //bit.ly/USFlightDelays en download gegevens voor het tijdsbestek van je keuze met de kolommen Flight Date , Reporting_Airline , Origin , Destination en DepartureDelayMinutes . Haal ook de opzoektabel op voor Reporting_Airline .

Of download deze twee gegevenssets - plus mijn R-code in een enkel bestand en een PowerPoint waarin verschillende soorten gegevenssamenvoegingen worden uitgelegd - hier:

download Code, gegevens en PowerPoint voor het samenvoegen van gegevens in R Bevat verschillende gegevensbestanden, een PowerPoint- en R-script bij het artikel. Sharon Machlis

Om het bestand met basis R in te lezen, zou ik eerst het vluchtvertragingsbestand uitpakken en vervolgens zowel de vluchtvertragingsgegevens als het code-opzoekbestand importeren met read.csv(). Als u de code gebruikt, heeft het vertragingsbestand dat u heeft gedownload waarschijnlijk een andere naam dan in de onderstaande code. Let ook op de ongebruikelijke .csv_extensie van het opzoekbestand .

unzip ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

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

Vervolgens zal ik beide bestanden bekijken met 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 NVT 5 2019-08-01 DL SLC PDX 0 NVT 6 2019-08-01 DL DTW ATL 10 NVT

head (mylookup) Code Beschrijving 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 Oosters

Fuseert met basis R

Het mydf-vertragingsdataframe bevat alleen informatie over de luchtvaartmaatschappij per code. Ik wil een kolom toevoegen met de namen van de luchtvaartmaatschappij van mylookup. Een basis R-manier om dit te doen is met de merge()functie, met behulp van de basissyntaxis merge(df1, df2). Het maakt niet uit wat de volgorde van dataframe 1 en dataframe 2 is, maar de eerste wordt als x beschouwd en de tweede is y. 

Als de kolommen waarbij u zich wilt aansluiten niet dezelfde naam hebben, moet u samenvoegen aangeven op welke kolommen u wilt aansluiten: by.xvoor de kolomnaam x dataframe en by.yvoor de kolom y, zoals merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

U kunt ook samenvoegen aangeven of u alle rijen wilt, inclusief rijen zonder overeenkomst, of alleen rijen die overeenkomen, met de argumenten all.xen all.y. In dit geval wil ik alle rijen van de vertragingsgegevens; als er geen luchtvaartmaatschappijcode in de opzoektabel staat, wil ik toch de informatie. Maar ik heb geen rijen uit de opzoektabel nodig die niet in de vertragingsgegevens staan ​​(er zijn enkele codes voor oude luchtvaartmaatschappijen die daar niet meer in vliegen). Dus is all.xgelijk TRUEmaar is all.ygelijk FALSE. Volledige code:

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

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

Het nieuwe samengevoegde dataframe bevat een kolom met de naam Beschrijving met de naam van de luchtvaartmaatschappij op basis van de vervoerdercode.

head (join_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Beschrijving 1 9E 2019-08-12 JFK SYR 0 NA Endeavour Air Inc. 2 9E 2019-08-12 TYS DTW 0 NA Endeavor 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 .

Sluit zich aan bij dplyr

dplyr gebruikt SQL-databasesyntaxis voor zijn join-functies. Een linkse join  betekent: alles aan de linkerkant opnemen (waarin was het x-dataframe merge()) en alle rijen die overeenkomen met het rechter (y) dataframe. Als de join-kolommen dezelfde naam hebben, hebt u alleen nodig left_join(x, y). Als ze niet dezelfde naam hebben, heb je een byargument nodig, zoals left_join(x, y, by = c("df1ColName" = "df2ColName")).

Let op de syntaxis voor by: Het is een benoemde vector, met zowel de linker- als de rechterkolomnaam tussen aanhalingstekens.

De code om beide datasets te importeren en samen te voegen, left_join()staat hieronder. Het begint met het laden van de dplyr- en readr-pakketten en leest vervolgens de twee bestanden in met read_csv(). Bij gebruik read_csv()hoef ik het bestand niet eerst uit te pakken.

bibliotheek (dplyr)

bibliotheek (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()creëert tibbles , een soort dataframe met enkele extra functies. left_join()voegt de twee samen. Bekijk de syntaxis: in dit geval is het belangrijk om te bestellen. left_join()betekent dat alle rijen aan de linkerkant of de eerste gegevensset zijn inbegrepen, maar alleen rijen die overeenkomen met de tweede . En omdat ik me moet aansluiten bij twee kolommen met een andere naam, heb ik een byargument toegevoegd.

We kunnen de structuur van het resultaat bekijken met de glimpse()functie van dplyr , wat een andere manier is om de bovenste paar items van een dataframe te zien.

glimpse (join_tibble) Waarnemingen: 658.461 Variabelen: 7 $ FL_DATE 01-08-2019, 01-08-2019, 01-08-2019, 01-08-2019, 01-08-2019… $ 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,… $ Beschrijving "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air ...

Deze samengevoegde dataset heeft nu een nieuwe kolom met de naam van de luchtvaartmaatschappij. Als u zelf een versie van deze code uitvoert, zult u waarschijnlijk merken dat dplyr veel sneller was dan basis R.

Laten we vervolgens eens kijken naar een supersnelle manier om joins te doen.