Как да обедините данни в R, като използвате R merge, dplyr или data.table

R има редица бързи, елегантни начини за свързване на рамки с данни от обща колона. Бих искал да ви покажа три от тях:

  • базова merge()функция R ,
  • семейството функции на dplyr и
  • синтаксис на скобата на data.table.

Вземете и импортирайте данните

За този пример ще използвам един от любимите ми демо набори от данни - времена на закъснение на полета от Американското бюро за транспортна статистика. Ако искате да продължите, насочете се към //bit.ly/USFlightDelays и изтеглете данни за избраната от вас време с колоните Flight Date , Reporting_Airline , Origin , Destination и DepartureDelayMinutes . Също така вземете справочната таблица за Reporting_Airline .

Или изтеглете тези два набора от данни - плюс моя R код в един файл и PowerPoint, обясняващ различни видове обединения на данни - тук:

изтеглете Код, данни и PowerPoint за това как да обедините данни в R Включва няколко файла с данни, PowerPoint и R скрипт, които да придружават статия. Шарън Маклис

За да прочета във файла с база R, първо разархивирам файла за забавяне на полета и след това импортирам както данните за забавяне на полета, така и файла за търсене на кода с read.csv(). Ако използвате кода, изтегленият от вас файл за забавяне вероятно ще има различно име от кода по-долу. Също така обърнете внимание на необичайното .csv_разширение на файла за търсене .

разархивирайте ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

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

След това ще надникна и в двата файла с 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

глава (mylookup) Код Описание 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 / б / а източен

Обединява с база R

Рамката за данни за закъснение mydf съдържа само информация за авиокомпанията по код. Бих искал да добавя колона с имената на авиокомпаниите от mylookup. Един основен R начин да направите това е с merge()функцията, използвайки основния синтаксис merge(df1, df2). Няма значение реда на рамка с данни 1 и рамка с данни 2, но който и да е първи, се счита за x, а вторият е y. 

Ако колоните, към които искате да се присъедините, нямат същото име, трябва да кажете на merge към кои колони искате да се присъедините: by.xза името на колоната x на рамката с данни и by.yза y, като например merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Можете също така да кажете на merge дали искате всички редове, включително тези без съвпадение, или само редове, които съвпадат, с аргументите all.xи all.y. В този случай бих искал всички редове от данните за забавяне; ако в справочната таблица няма код на авиокомпания, все още искам информацията. Но не ми трябват редове от справочната таблица, които не са в данните за забавяне (има някои кодове за стари авиокомпании, които вече не летят там). И така, all.xравно, TRUEно all.yравно FALSE. Пълен код:

joined_df <- обединяване (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "Код", all.x = TRUE, all.y = FALSE)

Новият обединен кадър за данни включва колона, наречена Описание с името на авиокомпанията въз основа на кода на превозвача.

head (joined_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Описание 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 .

Присъединява се с dplyr

dplyr използва синтаксиса на базата данни на SQL за своите функции за присъединяване. А лявото присъединят  средства: Включете всичко в ляво (това, което е рамката на х данни merge()) и всички редове, отговарящи на дясното (Y) рамката на данни. Ако колоните за присъединяване имат същото име, всичко, от което се нуждаете, е left_join(x, y). Ако те нямат същото име, имате нужда от byаргумент, като например left_join(x, y, by = c("df1ColName" = "df2ColName")).

Обърнете внимание на синтаксиса за by: Това е именуван вектор, като имената на лявата и дясната колона са в кавички.

Кодът за импортиране и обединяване на двата набора от данни left_join()е по-долу. Започва с зареждане на пакетите dplyr и readr и след това чете в двата файла с read_csv(). Когато използвам read_csv(), не е необходимо първо да разархивирам файла.

библиотека (dplyr)

библиотека (четец)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

joined_tibble <- left_join (mytibble, mylookup_tibble,

от = c ("OP_UNIQUE_CARRIER" = "Код"))

read_csv()създава таблици , които представляват тип рамка за данни с някои допълнителни функции. left_join()обединява двете. Погледнете синтаксиса: В този случай редът има значение. left_join()означава, че включва всички редове отляво или първия набор от данни, но само редове, които съвпадат от втория . И тъй като трябва да се присъединя от две различни имена на колони, включих byаргумент.

Можем да разгледаме структурата на резултата с функцията на dplyr glimpse(), което е друг начин да видим първите няколко елемента от рамка с данни.

glimpse (joined_tibble) Наблюдения: 658 461 променливи: 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, ... $ Описание "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air ...

Този обединен набор от данни вече има нова колона с името на авиокомпанията. Ако сами стартирате версия на този код, вероятно ще забележите, че dplyr е много по-бърз от базовия R.

След това нека разгледаме супер бърз начин за присъединяване.