Programování

Jak sloučit data v R pomocí R merge, dplyr nebo data.table

R má řadu rychlých a elegantních způsobů, jak spojit datové rámce pomocí společného sloupce. Chtěl bych vám ukázat tři z nich:

  • základny R. spojit() funkce,
  • dplyr's join family of functions, and
  • syntaxe závorky datové tabulky.

Získejte a importujte data

V tomto příkladu použiji jeden z mých oblíbených ukázkových datových souborů - doby zpoždění letu z amerického statistického úřadu pro dopravu. Pokud chcete pokračovat, přejděte na //bit.ly/USFlightDelays a stáhněte si data pro časový rámec podle vašeho výběru se sloupci Datum letu, Reporting_Airline, Původ, Destinace, a DepartureDelayMinutes. Získejte také vyhledávací tabulku pro Reporting_Airline.

Nebo si stáhněte tyto dvě datové sady - plus můj R kód v jednom souboru a PowerPoint vysvětlující různé typy sloučení dat - zde:

stáhněte si Code, data a PowerPoint, jak sloučit data v R Zahrnuje několik datových souborů, PowerPoint a R skript k článku. Sharon Machlis

Chcete-li číst v souboru se základnou R, nejprve bych rozbalil soubor zpoždění letu a poté importoval data zpoždění letu a soubor vyhledávání kódu pomocí read.csv (). Pokud spouštíte kód, stažený soubor zpoždění bude mít pravděpodobně jiný název než v kódu níže. Všimněte si také neobvyklosti vyhledávacího souboru .csv_ rozšíření.

rozbalit ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

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

Dále se podívám na oba soubory s hlava():

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) Kód Popis 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 východní

Sloučí se základnou R.

Datový rámec mydf delay obsahuje pouze informace o letecké společnosti podle kódu. Chtěl bych přidat sloupec s názvy leteckých společností z můj výhled. Jeden základní způsob R, jak toho dosáhnout, je s spojit() funkce pomocí základní syntaxe sloučit (df1, df2). Nezáleží na pořadí datového rámce 1 a datového rámce 2, ale kterýkoli z nich je první, je považován za x a druhý je y.

Pokud sloupce, ke kterým se chcete připojit, nemají stejný název, musíte sloučit, ke kterým sloupcům se chcete připojit: od .x pro název sloupce datového rámce x a by.y. pro y, jako je sloučit (df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Můžete také říct sloučení, zda chcete všechny řádky, včetně těch bez shody, nebo jen řádky, které se shodují, s argumenty all.x a spojenec. V tomto případě bych chtěl všechny řádky z dat zpoždění; pokud ve vyhledávací tabulce není žádný kód letecké společnosti, stále potřebuji informace. Ale nepotřebuji řádky z vyhledávací tabulky, které nejsou v datech zpoždění (existují některé kódy pro staré letecké společnosti, které tam už nelétají). Tak, all.x se rovná SKUTEČNÝ ale spojenec se rovná NEPRAVDIVÉ. Celý kód:

join_df <- sloučit (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

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

Nový spojený datový rámec obsahuje sloupec s názvem Popis s názvem letecké společnosti na základě kódu dopravce.

head (join_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Popis 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 .

Připojuje se k dplyr

dplyr používá pro své funkce spojení syntaxi databáze SQL. A levé připojení znamená: Zahrnout vše nalevo (jaký byl datový rámec x v spojit()) a všechny řádky, které se shodují z pravého (y) datového rámce. Pokud mají sloupce spojení stejný název, vše, co potřebujete, je left_join (x, y). Pokud nemají stejné jméno, potřebujete podle argument, jako je left_join (x, y, by = c ("df1ColName" = "df2ColName")) .

Všimněte si syntaxe pro podle: Je to pojmenovaný vektor s názvy levého i pravého sloupce v uvozovkách.

Kód pro import a sloučení obou sad dat pomocí left_join () je níže. Začíná to načtením balíků dplyr a readr a poté načte dva soubory pomocí read_csv (). Při použití read_csv (), Nejprve nemusím soubor rozbalit.

knihovna (dplyr)

knihovna (readr)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

join_tibble <- left_join (mytibble, mylookup_tibble,

autor = c ("OP_UNIQUE_CARRIER" = "Kód"))

read_csv () vytváří tibbles, což jsou typ datového rámce s některými dalšími funkcemi. left_join () spojuje dva. Podívejte se na syntaxi: V tomto případě záleží na pořadí. left_join () prostředek zahrnout všechny řádky nalevo nebo první datovou sadu, ale pouze řádky, které se shodují s druhou. A protože se musím připojit dvěma odlišně pojmenovanými sloupci, zahrnul jsem a podle argument.

Na strukturu výsledku se můžeme podívat pomocí dplyr's záblesk() funkce, což je další způsob, jak zobrazit prvních pár položek datového rámce.

glimpse (join_tibble) Pozorování: 658 461 Proměnné: 7 $ FL_DATE 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, ... $ Popis "Delta Air Lines Inc.", "Delta Air Lines Inc.", " Delta Air…

Tato připojená datová sada má nyní nový sloupec s názvem letecké společnosti. Pokud používáte verzi tohoto kódu sami, pravděpodobně si všimnete, že dplyr byl mnohem rychlejší než základní R.

Dále se podívejme na superrychlý způsob připojení.