Programmering

Hvordan slå sammen data i R ved å bruke R merge, dplyr eller data.table

R har en rekke raske, elegante måter å bli med på datarammer med en vanlig kolonne. Jeg vil gjerne vise deg tre av dem:

  • basere R’er slå sammen() funksjon,
  • dplyr’s blir med familie av funksjoner, og
  • data.tables braktsyntaks.

Få og importer dataene

For dette eksemplet vil jeg bruke et av mine favoritt demodatasett - flyforsinkelsestider fra US Bureau of Transportation Statistics. Hvis du vil følge med, gå til //bit.ly/USFlightDelays og last ned data for tidsrammen du ønsker med kolonnene Flydato, Reporting_Airline, Opprinnelse, Mål, og DepartureDelayMinutes. Få også oppslagstabellen for Reporting_Airline.

Eller last ned disse to datasettene - pluss R-koden min i en enkelt fil og en PowerPoint som forklarer forskjellige typer datasammenslåinger - her:

last ned kode, data og PowerPoint for hvordan du slår sammen data i R Inkluderer flere datafiler, et PowerPoint- og R-skript som følger med artikkelen. Sharon Machlis

For å lese i filen med base R, vil jeg først pakke ut forsinkelsesfilen og deretter importere både flyforsinkelsesdata og kodeoppslagsfilen med read.csv (). Hvis du kjører koden, vil forsinkelsesfilen du lastet ned sannsynligvis ha et annet navn enn i koden nedenfor. Vær også oppmerksom på oppslagsfilen er uvanlig .csv_ Utvidelse.

pakke ut ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

sitat = "\" ", sep =", ")

Deretter tar jeg en titt på begge filene med hode():

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) Kode Beskrivelse 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 østlig

Fusjonerer med base R

Mydf-forsinkelsesdatarammen har kun flyinformasjon etter kode. Jeg vil gjerne legge til en kolonne med flyselskapets navn fra mylookup. En base R måte å gjøre dette på er med slå sammen() funksjon, ved hjelp av den grunnleggende syntaksen flette (df1, df2). Det spiller ingen rolle rekkefølgen på datarammen 1 og datarammen 2, men den som er den første regnes som x og den andre er y.

Hvis kolonnene du vil bli med ikke har samme navn, må du fortelle hvilke kolonner du vil bli med etter: av.x for x datarammen kolonnenavn, og av.y for y, slik som slå sammen (df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Du kan også fortelle om du vil ha alle radene, inkludert de uten samsvar, eller bare rader som samsvarer, med argumentene all.x og alliert. I dette tilfellet vil jeg ha alle radene fra forsinkelsesdataene; hvis det ikke er noen flyselskapskode i oppslagstabellen, vil jeg fortsatt ha informasjonen. Men jeg trenger ikke rader fra oppslagstabellen som ikke er i forsinkelsesdataene (det er noen koder for gamle flyselskaper som ikke flyr lenger der inne). Så, all.x er lik EKTE men alliert er lik FALSK. Full kode:

joined_df <- flett (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

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

Den nye sammenkoblede datarammen inkluderer en kolonne som heter Beskrivelse med navnet på flyselskapet basert på transportørkoden.

head (joined_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Beskrivelse 1 9E 2019-08-12 JFK SYR 0 NA Endeavor Air Inc. 2 9E 2019-08-12 TYS DTW 0 NA Endeavour Air Inc. 0 NA Endeavour Air Inc. 4 9E 13.08.2019 IAH MSP 6 NA Endeavour Air Inc. 5 9E 12.08.2019 DTW JFK 58 NA Endeavour Air Inc. 6 9E 12.08.2019 SYR JFK 0 NA Endeavour Air Inc .

Blir med dplyr

dplyr bruker SQL-databasesyntaks for sine sammenføyningsfunksjoner. EN venstre bli med betyr: Inkluder alt til venstre (hva var x datarammen i slå sammen()) og alle rader som samsvarer med fra høyre (y) dataramme. Hvis tilknytningskolonnene har samme navn, er alt du trenger left_join (x, y). Hvis de ikke har samme navn, trenger du en av argument, slik som left_join (x, y, by = c ("df1ColName" = "df2ColName")) .

Legg merke til syntaksen for av: Det er en navngitt vektor, med både venstre og høyre kolonnenavn i anførselstegn.

Koden for å importere og slå sammen begge datasettene ved hjelp av left_join () er under. Det starter med å laste inn dplyr- og readr-pakkene og leser deretter i de to filene med read_csv (). Når du bruker read_csv (), Jeg trenger ikke å pakke ut 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" = "Kode"))

read_csv () skaper tibbles, som er en type dataramme med noen ekstra funksjoner. left_join () slår sammen de to. Ta en titt på syntaksen: I dette tilfellet betyr ordre. left_join () midler inkluderer alle rader til venstre eller første datasett, men bare rader som samsvarer med den andre. Og fordi jeg trenger å bli med med to forskjellige kolonner, inkluderte jeg en av argument.

Vi kan se på strukturen i resultatet med dplyr’s glimt () funksjon, som er en annen måte å se de øverste elementene i en dataramme.

glimt (joined_tibble) Observasjoner: 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, ... $ Beskrivelse "Delta Air Lines Inc.", "Delta Air Lines Inc.", " Delta Air ...

Dette sammenlagte datasettet har nå en ny kolonne med navnet på flyselskapet. Hvis du kjører en versjon av denne koden selv, vil du sannsynligvis merke at dplyr var langt raskere enn base R.

La oss deretter se på en superrask måte å bli med på.

$config[zx-auto] not found$config[zx-overlay] not found