Jak scalić dane w R za pomocą R merge, dplyr lub data.table

R ma wiele szybkich i eleganckich sposobów łączenia ramek danych za pomocą wspólnej kolumny. Chciałbym wam pokazać trzy z nich:

  • podstawowa merge()funkcja R ,
  • dplyr dołącza rodzinę funkcji i
  • Składnia nawiasów w data.table.

Pobierz i zaimportuj dane

W tym przykładzie użyję jednego z moich ulubionych zestawów danych demonstracyjnych - czasów opóźnienia lotów z US Bureau of Transportation Statistics. Jeśli chcesz kontynuować, przejdź do //bit.ly/USFlightDelays i pobierz dane z wybranego przedziału czasowego za pomocą kolumn Flight Date , Reporting_Airline , Origin , Destination i DepartureDelayMinutes . Pobierz również tabelę przeglądową dla Reporting_Airline .

Lub pobierz te dwa zestawy danych - plus mój kod R w jednym pliku i PowerPoint wyjaśniający różne typy scalania danych - tutaj:

pobierz Kod, dane i PowerPoint, aby dowiedzieć się, jak scalić dane w języku R Zawiera kilka plików danych, skrypt programu PowerPoint i skrypt języka R do artykułu. Sharon Machlis

Aby wczytać plik z podstawowym R, najpierw rozpakowałem plik opóźnienia lotu, a następnie zaimportowałem zarówno dane opóźnienia lotu, jak i plik wyszukiwania kodu z read.csv(). Jeśli uruchamiasz kod, pobrany plik opóźnienia prawdopodobnie będzie miał inną nazwę niż w kodzie poniżej. Zwróć także uwagę na nietypowe .csv_rozszerzenie pliku wyszukiwania .

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 =", ")

Następnie przyjrzę się obu plikom z head():

head (mydf) FL_DATE OP_UNIQUE_CARRIER ORIGIN DEST DEP_DELAY_NEW X 1 2019-08-01 DL ATL DFW 31 ND 2 2019-08-01 DL DFW ATL 0 ND 3 2019-08-01 DL IAH ATL 40 ND 4 2019-08-01 DL PDX SLC 0 ND 5 2019-08-01 DL SLC PDX 0 ND 6 2019-08-01 DL DTW ATL 10 ND

głowa (mylookup) Kod 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 Wschodnia

Łączy się z podstawowym R.

Ramka danych opóźnienia mydf zawiera tylko informacje o linii lotniczej według kodu. Chciałbym dodać kolumnę z nazwami linii lotniczych od mylookup. Jednym z podstawowych sposobów w R jest merge()użycie funkcji przy użyciu podstawowej składni merge(df1, df2). Nie ma znaczenia kolejność ramki danych 1 i ramki danych 2, ale pierwsza jest uważana za x, a druga za y. 

Jeśli kolumny, według których chcesz dołączyć, nie mają tej samej nazwy, musisz powiedzieć scalaniu, które kolumny chcesz połączyć: by.xdla nazwy kolumny ramki danych x i by.ydla kolumny y, takiej jak merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Możesz również określić scalanie, czy chcesz, aby wszystkie wiersze, w tym wiersze bez dopasowania, czy tylko wiersze pasujące, z argumentami all.xi all.y. W tym przypadku chciałbym wszystkie wiersze z danych opóźnienia; jeśli w tabeli wyszukiwania nie ma kodu linii lotniczej, nadal potrzebuję informacji. Ale nie potrzebuję wierszy z tabeli odnośników, których nie ma w danych o opóźnieniach (jest kilka kodów dla starych linii lotniczych, które już tam nie latają). Więc all.xrówna się, TRUEale all.yrówna FALSE. Pełny kod:

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

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

Nowa połączona ramka danych zawiera kolumnę o nazwie Opis z nazwą linii lotniczej na podstawie kodu przewoźnika.

głowa (dołączyła_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Opis 1 9E 2019-08-12 JFK SYR 0 ND Endeavour Air Inc. 2 9E 2019-08-12 TYS DTW 0 ND 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 .

Łączy się z dplyr

dplyr używa składni bazy danych SQL do swoich funkcji łączenia. Lewej przyłączyć  środki: Dołącz wszystko na lewo (co było ramka danych x w merge()) i wszystkie wiersze, które mecze z prawej (y) ramki danych. Jeśli kolumny łączenia mają tę samą nazwę, wszystko, czego potrzebujesz, to left_join(x, y). Jeśli nie mają tej samej nazwy, potrzebujesz byargumentu, na przykład left_join(x, y, by = c("df1ColName" = "df2ColName")).

Zwróć uwagę na składnię dla by: To nazwany wektor, z lewą i prawą kolumną w cudzysłowie.

Kod służący do importowania i łączenia obu zestawów danych left_join()znajduje się poniżej. Rozpoczyna się od załadowania pakietów dplyr i readr, a następnie wczytuje oba pliki z rozszerzeniem read_csv(). Podczas używania read_csv()nie muszę najpierw rozpakowywać pliku.

biblioteka (dplyr)

biblioteka (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" = "Kod"))

read_csv()tworzy tibbles , które są rodzajem ramki danych z dodatkowymi funkcjami. left_join()łączy te dwa. Spójrz na składnię: w tym przypadku porządek ma znaczenie. left_join()oznacza, że obejmują wszystkie wiersze po lewej stronie lub pierwszym zestawie danych, ale tylko wiersze, które pasują do drugiego . A ponieważ muszę połączyć dwiema różnymi nazwami kolumn, dołączyłem byargument.

Możemy przyjrzeć się strukturze wyniku za pomocą glimpse()funkcji dplyr , która jest innym sposobem zobaczenia kilku górnych elementów ramki danych.

glimpse (connected_tibble) Obserwacje: 658 461 Zmienne: 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, NA, NA, NA,… $ Opis „Delta Air Lines Inc.”, „Delta Air Lines Inc.”, „Delta Air…

Ten połączony zestaw danych ma teraz nową kolumnę z nazwą linii lotniczej. Jeśli samodzielnie uruchomisz wersję tego kodu, prawdopodobnie zauważysz, że dplyr był znacznie szybszy niż podstawowy R.

Następnie przyjrzyjmy się superszybkiemu sposobowi łączenia.