Kako spojiti podatke u R pomoću R merge, dplyr ili data.table

R ima brojne brze i elegantne načine spajanja okvira podataka zajedničkim stupcem. Želio bih vam pokazati njih tri:

  • osnovna merge()funkcija R ,
  • dplyr-ova obitelj funkcija i
  • sintaksa zagrade tablice.

Dohvatite i uvezite podatke

Za ovaj primjer upotrijebit ću jedan od mojih najdražih demo skupova podataka - vrijeme kašnjenja leta od američkog Zavoda za statistiku prometa. Ako želite slijediti, glavu na //bit.ly/USFlightDelays i preuzimanje podataka za vremenski okvir po vašem izboru sa stupcima Flight Datum , Reporting_Airline , izvornosti , odredište i DepartureDelayMinutes . Također nabavite tablicu pretraživanja za Reporting_Airline .

Ili preuzmite ova dva skupa podataka - plus moj R kôd u jednu datoteku i PowerPoint koji objašnjava različite vrste spajanja podataka - ovdje:

preuzmite Kôd, podatke i PowerPoint za spajanje podataka u R Uključuje nekoliko podatkovnih datoteka, PowerPoint i R skriptu uz članak. Sharon Machlis

Da bih pročitao datoteku s bazom R, prvo bih raspakirao datoteku odgode leta, a zatim uvezio podatke o kašnjenju leta i datoteku pretraživanja koda sa read.csv(). Ako koristite kôd, preuzeta datoteka kašnjenja vjerojatno će imati drugačije ime od donjeg koda. Također, imajte na umu neobično .csv_proširenje datoteke pretraživanja .

raspakirajte ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

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

Dalje ću zaviriti u obje datoteke s head():

glava (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

glava (mylookup) Šifra Opis 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 istočni

Spaja se s bazom R

Okvir podataka o kašnjenju mydf sadrži samo podatke o zrakoplovnoj kompaniji prema kodu. Želio bih dodati stupac s imenima zrakoplovnih kompanija iz mylookup. Jedan osnovni R način za to je s merge()funkcijom, koristeći osnovnu sintaksu merge(df1, df2). Nije važan redoslijed okvira podataka 1 i okvira podataka 2, ali koji god da je prvi smatra se x, a drugi y. 

Ako stupci kojima se želite pridružiti nemaju isto ime, trebate reći merge kojim stupcima želite pridružiti: by.xza naziv stupca x podatkovni okvir i by.yza y, kao što je merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Spajanju također možete reći želite li sve retke, uključujući one bez podudaranja, ili samo retke koji se podudaraju, s argumentima all.xi all.y. U ovom bih slučaju volio sve retke iz podataka o kašnjenju; ako u tablici za pretraživanje nema zrakoplovnog koda, svejedno želim informacije. Ali ne trebaju mi ​​retci iz tablice pretraživanja koji nisu u podacima o kašnjenju (postoje neki kodovi za stare zrakoplovne tvrtke koje tamo više ne lete). Dakle, all.xjednako, TRUEali all.yjednako FALSE. Puni kod:

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

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

Novi pridruženi okvir podataka uključuje stupac pod nazivom Opis s imenom zrakoplovne tvrtke na temelju koda prijevoznika.

glava (joined_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Opis 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 .

Pridružuje se dplyr-u

dplyr koristi sintaksu baze podataka SQL za svoje funkcije pridruživanja. Lijevi pridružiti  sredstva: Uključi sve na lijevoj strani (što je bila x okvir podataka u merge()) i sve retke koji odgovaraju iz pravu (y) okvira podataka. Ako stupci za pridruživanje imaju isto ime, sve što trebate je left_join(x, y). Ako nemaju isto ime, potreban vam je byargument, kao što je left_join(x, y, by = c("df1ColName" = "df2ColName")).

Obratite pažnju na sintaksu za by: To je imenovani vektor, s lijevim i desnim imenima stupaca u navodnicima.

Kôd za uvoz i spajanje oba skupa podataka left_join()je dolje. Počinje učitavanjem dplyr i readr paketa, a zatim čita dvije datoteke s read_csv(). Prilikom upotrebe read_csv()ne moram prvo otvoriti datoteku.

knjižnica (dplyr)

knjižnica (čitač)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

joined_tibble <- left_join (mytibble, mylookup_tibble,

od = c ("OP_UNIQUE_CARRIER" = "Kod"))

read_csv()stvara tablice , koje su vrsta podatkovnog okvira s nekim dodatnim značajkama. left_join()spaja to dvoje. Pogledajte sintaksu: U ovom je slučaju redoslijed važan. left_join()znači da uključuju sve retke s lijeve strane ili prvi skup podataka, ali samo retke koji se podudaraju s drugim . I, jer se moram pridružiti s dva različito nazvana stupca, uključio sam byargument.

Strukturu rezultata možemo pogledati s funkcijom dplyr glimpse(), što je još jedan način da se vidi nekoliko prvih stavki okvira podataka.

uvid (joined_tibble) Zapažanja: 658.461 Varijable: 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 ", ... $ PORIJEKLO" 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, ... $ Opis "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air ...

Ovaj udruženi skup podataka sada ima novi stupac s imenom zrakoplovne tvrtke. Ako sami pokrenete verziju ovog koda, vjerojatno ćete primijetiti da je dplyr bio brži od baze R.

Dalje, pogledajmo superbrzi način spajanja.