Comment fusionner des données dans R à l'aide de R merge, dplyr ou data.table

R dispose d'un certain nombre de moyens rapides et élégants pour joindre des blocs de données par une colonne commune. J'aimerais vous en montrer trois:

  • la merge()fonction de base R ,
  • la famille de fonctions de dplyr, et
  • Syntaxe des crochets de data.table.

Obtenez et importez les données

Pour cet exemple, j'utiliserai l'un de mes ensembles de données de démonstration préférés - les délais de vol du Bureau of Transportation Statistics des États-Unis. Si vous souhaitez suivre, rendez-vous sur //bit.ly/USFlightDelays et téléchargez les données pour la période de votre choix avec les colonnes Date de vol , Reporting_Airline , Origine , Destination et DépartDelayMinutes . Obtenez également la table de recherche pour Reporting_Airline .

Ou, téléchargez ces deux ensembles de données - plus mon code R dans un seul fichier et un PowerPoint expliquant différents types de fusion de données - ici:

télécharger du code, des données et PowerPoint pour savoir comment fusionner des données dans R Inclut plusieurs fichiers de données, un script PowerPoint et R pour accompagner l'article. Sharon Machlis

Pour lire le fichier avec la base R, je décompresserais d'abord le fichier de retard de vol, puis j'importerais les données de retard de vol et le fichier de recherche de code avec read.csv(). Si vous exécutez le code, le fichier de délai que vous avez téléchargé aura probablement un nom différent de celui indiqué dans le code ci-dessous. Notez également l' .csv_extension inhabituelle du fichier de recherche .

décompresser ("673598238_T_ONTIME_REPORTING.zip")

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

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

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

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

Ensuite, je vais jeter un coup d'œil aux deux fichiers avec 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) Code Description 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 Est

Fusion avec la base R

La trame de données de retard mydf ne contient que des informations sur la compagnie aérienne par code. Je voudrais ajouter une colonne avec les noms des compagnies aériennes mylookup. Une manière de base R de le faire est d' merge()utiliser la fonction, en utilisant la syntaxe de base merge(df1, df2). L'ordre de la trame de données 1 et de la trame de données 2 n'a pas d'importance, mais celui qui est le premier est considéré comme x et le second est y. 

Si les colonnes que vous souhaitez joindre n'ont pas le même nom, vous devez indiquer à merge les colonnes que vous souhaitez joindre: by.xpour le nom de la colonne du bloc de données x et by.ypour celui y, tel que merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Vous pouvez également indiquer à merge si vous voulez toutes les lignes, y compris celles sans correspondance, ou uniquement les lignes qui correspondent, avec les arguments all.xet all.y. Dans ce cas, je voudrais toutes les lignes des données de retard; s'il n'y a pas de code de compagnie aérienne dans la table de recherche, je veux toujours les informations. Mais je n'ai pas besoin de lignes de la table de recherche qui ne sont pas dans les données de retard (il y a des codes pour les anciennes compagnies aériennes qui ne volent plus là-dedans). Donc, all.xégal TRUEmais all.yégal FALSE. Code complet:

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

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

La nouvelle trame de données jointe comprend une colonne appelée Description avec le nom de la compagnie aérienne en fonction du code du transporteur.

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

Rejoint avec dplyr

dplyr utilise la syntaxe de base de données SQL pour ses fonctions de jointure. Une jointure à gauche  signifie: Inclut tout ce qui se trouve à gauche (dans quel était le bloc de données x merge()) et toutes les lignes qui correspondent à partir du bloc de données droit (y). Si les colonnes de jointure portent le même nom, tout ce dont vous avez besoin est left_join(x, y). S'ils n'ont pas le même nom, vous avez besoin d'un byargument, tel que left_join(x, y, by = c("df1ColName" = "df2ColName")).

Notez la syntaxe pour by: C'est un vecteur nommé, avec les noms de colonne gauche et droite entre guillemets.

Le code pour importer et fusionner les deux ensembles de données à l'aide left_join()est ci-dessous. Il commence par charger les packages dplyr et readr, puis lit les deux fichiers avec read_csv(). Lors de l'utilisation read_csv(), je n'ai pas besoin de décompresser le fichier au préalable.

bibliothèque (dplyr)

bibliothèque (readr)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

join_tibble <- left_join (mytibble, mylookup_tibble,

par = c ("OP_UNIQUE_CARRIER" = "Code"))

read_csv()crée des tibbles , qui sont un type de bloc de données avec quelques fonctionnalités supplémentaires. left_join()fusionne les deux. Jetez un œil à la syntaxe: Dans ce cas, l'ordre est important. left_join()signifie inclure toutes les lignes sur la gauche, ou le premier ensemble de données, mais uniquement les lignes qui correspondent au second . Et, comme je dois joindre deux colonnes nommées différemment, j'ai inclus un byargument.

Nous pouvons regarder la structure du résultat avec la glimpse()fonction de dplyr , qui est une autre façon de voir les premiers éléments d’une trame de données.

glimpse (joins_tibble) Observations: 658 461 Variables: 7 $ FL_DATE 01/08/2019, 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,… $ Description "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air…

Cet ensemble de données joint a maintenant une nouvelle colonne avec le nom de la compagnie aérienne. Si vous exécutez vous-même une version de ce code, vous remarquerez probablement que dplyr était bien plus rapide que la base R.

Ensuite, examinons un moyen ultra-rapide de créer des jointures.