Programmering

Sådan flettes data i R ved hjælp af R merge, dplyr eller data.table

R har en række hurtige, elegante måder at forbinde datarammer med en fælles kolonne. Jeg vil gerne vise dig tre af dem:

  • base R'er fusionere() fungere,
  • dplyr slutter sig til familie af funktioner og
  • data.tables parentes-syntaks.

Hent og importer dataene

I dette eksempel bruger jeg et af mine foretrukne demo-datasæt - flyforsinkelsestider fra U.S. Bureau of Transportation Statistics. Hvis du vil følge med, skal du gå til //bit.ly/USFlightDelays og downloade data til den valgte tidsramme med kolonnerne Flydato, Reporting_Airline, Oprindelse, Bestemmelsesstedog AfgangDelayMinutes. Få også opslagstabellen til Reporting_Airline.

Eller download disse to datasæt - plus min R-kode i en enkelt fil og en PowerPoint, der forklarer forskellige typer datafletninger - her:

download kode, data og PowerPoint for at flette data i R Inkluderer flere datafiler, et PowerPoint- og R-script, der skal ledsages af artiklen. Sharon Machlis

For at læse i filen med base R, ville jeg først pakke ud flyforsinkelsesfilen og derefter importere både flyforsinkelsesdata og kodeopslagsfilen med read.csv (). Hvis du kører koden, vil forsinkelsesfilen, du downloadede, sandsynligvis have et andet navn end i koden nedenfor. Bemærk også, at opslagsfilen er usædvanlig .csv_ udvidelse.

pakke ud ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

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

Dernæst kigger jeg på begge filer med hoved():

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

Fusionerer med base R

Mydf-forsinkelsesdatarammen har kun flyselskabsoplysninger efter kode. Jeg vil gerne tilføje en kolonne med flyselskabens navne fra mylookup. En base R måde at gøre dette på er med fusionere() funktion ved hjælp af den grundlæggende syntaks flet (df1, df2). Det betyder ikke noget i rækkefølgen af ​​dataramme 1 og dataramme 2, men den, der er først, betragtes som x, og den anden er y.

Hvis de kolonner, du vil deltage i, ikke har det samme navn, skal du fortælle, hvilke kolonner du vil deltage efter: af.x for x datarammens kolonnenavn og af.y for y, såsom flet (df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Du kan også fortælle fletning, om du vil have alle rækker, inklusive dem uden match, eller bare rækker, der matcher, med argumentene all.x og allieret. I dette tilfælde vil jeg gerne have alle rækkerne fra forsinkelsesdataene; hvis der ikke er nogen flyselskabskode i opslagstabellen, vil jeg stadig have oplysningerne. Men jeg har ikke brug for rækker fra opslagstabellen, der ikke er i forsinkelsesdataene (der er nogle koder for gamle flyselskaber, der ikke flyver længere derinde). Så, all.x lige med RIGTIGT men allieret lige med FALSK. Fuld kode:

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

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

Den nye tilsluttede dataramme inkluderer en kolonne kaldet Beskrivelse med navnet på flyselskabet baseret på luftfartsselskabskoden.

head (joined_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Beskrivelse 1 9E 2019-08-12 JFK SYR 0 NA Endeavour 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 .

Går sammen med dplyr

dplyr bruger SQL-databasesyntaks til sine sammenføjningsfunktioner. EN venstre deltage betyder: Inkluder alt til venstre (hvad var x datarammen i fusionere()) og alle rækker, der matcher fra højre (y) dataramme. Hvis sammenkædningskolonnerne har samme navn, er alt hvad du behøver venstre_tilslut (x, y). Hvis de ikke har samme navn, skal du bruge en ved argument, såsom left_join (x, y, by = c ("df1ColName" = "df2ColName")) .

Bemærk syntaksen for ved: Det er en navngivet vektor med både venstre og højre kolonnenavn i anførselstegn.

Koden til at importere og flette begge datasæt ved hjælp af venstre_tilslut () er under. Det starter med at indlæse dplyr- og readr-pakkerne og læser derefter i de to filer med read_csv (). Ved brug read_csv (), Jeg behøver ikke at pakke filen ud 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,

af = c ("OP_UNIQUE_CARRIER" = "Kode"))

read_csv () skaber plaster, som er en type dataramme med nogle ekstra funktioner. venstre_tilslut () fusionerer de to. Se på syntaksen: I dette tilfælde betyder ordre noget. venstre_tilslut () midler inkluderer alle rækker til venstre eller første datasæt, men kun rækker, der matcher fra den anden. Og fordi jeg har brug for at slutte mig til to kolonner, der er navngivet forskelligt, inkluderede jeg en ved argument.

Vi kan se på strukturen af ​​resultatet med dplyr's glimt () funktion, som er en anden måde at se de øverste par emner i en dataramme på.

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, ... $ Beskrivelse "Delta Air Lines Inc.", "Delta Air Lines Inc.", " Delta Air…

Dette tilsluttede datasæt har nu en ny kolonne med navnet på flyselskabet. Hvis du selv kører en version af denne kode, vil du sandsynligvis bemærke, at dplyr var langt hurtigere end base R.

Lad os derefter se på en superhurtig måde at gøre sammenføjninger på.

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