Как объединить данные в 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():

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) Код Описание 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. 

Если столбцы, которые вы хотите объединить, не имеют одинакового имени, вам необходимо указать слиянию, какие столбцы вы хотите объединить: by.xдля имени столбца фрейма данных x и by.yдля имени столбца y, например merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

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

connected_df <- объединить (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "Код", all.x = ИСТИНА, all.y = ЛОЖЬ)

Новый объединенный фрейм данных включает столбец с названием «Описание» с названием авиакомпании на основе кода перевозчика.

head (connected_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()) и все строки , которые соответствуют из кадра данных вправо (у). Если столбцы соединения имеют одинаковое имя, все, что вам нужно, это 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_")

connected_tibble <- left_join (mytibble, mylookup_tibble,

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

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

Мы можем посмотреть на структуру результата с помощью glimpse()функции dplyr , которая является еще одним способом увидеть несколько верхних элементов фрейма данных.

glimpse (connected_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.

Затем давайте посмотрим на сверхбыстрый способ объединения.