Fusionner les lignes de deux data frame

Lorsqu’on analyse des données, il peut arriver qu’on ait besoin de fusionner les lignes de plusieurs data frames pour constituer un seul grand tableau de données. Dans d’autres situations, on a besoin de savoir si des lignes sont redondantes sur plusieurs data frames, et si c’est le cas de fusionner les données, mais sans ces répétitions. On peut encore avoir besoin de créer un nouveau jeu de données en ne conservant que les lignes qui sont communes à deux data frames. Ou au contraire en ne conservant que les lignes présentes dans l’ un des deux fichiers.

Toutes ces situations peuvent être gérées avec les fonctions de combinaisons de lignes du package dplyr fusion de jeux de données

D’aprés la cheatsheet du package dplyr

 

Ce sont ces fonctions que je vous propose d’explorer dans cet article.

 

1 Les data

Pour illustrer les différents cas de figure, je vais utiliser les jeux de données fish1 et fish2. Je les ai créés à partir du jeu de données des captures de poissons (tag00076) de la base de données d’Eurostats.

Le jeu de données fish1, contient les prises de poissons (en tonnes) réalisées en 2006 pour la Belgique, le Danemark, la Croatie, l’Estonie, la Grèce et la Finlande :

 

Le fichier nommé “fish2“, contient les mêmes informations pour la Belgique, le Danemark, la Croatie, la Norvège, le Portugal et la Turquie :

 

Remarque : Les jeux de données fish1 et fish2 sont au format tibble. Néanmoins, les fonctions présentées plus loin, sont également utilisables avec des données au format data.frame.

 

2 Tester si les 2 jeux de données sont identiques

Avant de fusionner deux jeux de données, il peut être intéressant de vérifier si ceux-ci sont identiques ou non. Ici, nous savons que ce n’est pas le cas, mais lorsque le nombre de lignes est important, la vérification visuelle n’est pas toujours évidente. Dans cette situation, la fonction setequal() peut être employée :

La fonction renvoie FALSE, ce qui signifie que les deux jeux de données ne sont pas identiques.

Pour celles ou ceux qui se demanderaient si l’ordre des données est important, la réponse est NON !

Pour le vérifier, je crée un fichier fish3, copie de fish1, puis j’ordonne les lignes par valeur croissante des captures de poissons (variables values) :

 

Dés lors, les jeux de données fish1 et fish3 comportent les mêmes données, mais dans un ordre différent.

Dans cette situation, la fonction setequal() renvoit bien TRUE, ce qui signifie que les fichiers sont identiques:

 

3 Fusion de l’ensemble des lignes

Une première façon de vouloir combiner deux jeux de données peut consister à simplement les empiler l’un sur l’autre. Pour cela, on peut utiliser la fonction bind_rows()  :

 

Le jeu de données final comporte 12 lignes, c’est à dire les 6 lignes du data frame (tableau) fish 1 et les 6 lignes du data frame fish2.

 

4 Fusion basée sur l’union (au sens mathématique)

Une autre façon de vouloir combiner deux jeux de données peut consister à les empiler, mais en retirant les lignes du deuxième jeu de données qui sont déjà présentes dans le premier. Pour cela, on utilise la fonction union() :

 

Cette fois, le jeu de données ne comporte que 9 lignes. Les lignes correspondant à la Belgique, le Danemark et la Croatie ne sont présentes qu’une seule fois, alors qu’elles étaient aussi présentes dans le deuxième data frame.

 

5 Fusion basée sur l’intersection (au sens mathématique)

Dans certaines situations, on peut vouloir, au contraire, créer un nouveau jeu de données qui contiendra uniquement les lignes qui sont à la fois présentes dans le premier et dans le deuxième data frame.

Dans un premier temps, on peut visualiser ces lignes qui sont communes aux deux jeux de données, en employant la fonction semi_join():

 

La fonction nous permet bien de visualiser les lignes correspondant à la Belgique, le Danemark et la Croatie.

 

Pour créer ce nouveau data frame qui ne contiendra que les lignes qui sont à la fois présentes dans le premier et dans le deuxième jeu de données, on emploie la fonction intersect(), comme ceci:

 

6 Fusion basée sur la différence

Enfin, un dernier cas de figure est celui dans lequel on souhaite créer un jeu de données en ne conservant que les lignes présentes dans le premier data frame et absentes dans le deuxième.

Comme précédemment, on peut, dans un premier temps visualiser ces lignes en employant la fonction anti_join().

Par exemple, si l’on souhaite visualiser les lignes présentes dans fish1 et absentes de fish2, on utilisera la code suivant :

 

Si l’on souhaite, au contraire, visualiser les lignes présentes dans fish2 et absente de fish1, on inversera l’ordre des data frames en argument de la fonction anti_join() :

 

Enfin, pour créer les jeux de données correspondant, on utilisera les commandes suivantes :

 

Et l’inverse :

 

J’espère que ce petit article vous permettra de fusionner les lignes de vos jeux de données de façon plus sereine et plus optimale. Dans un prochain article, je vous montrerai comment fusionner deux jeux de données, mais en terme de variables cette fois, autrement dit de colonnes).

Et si cet article vous a plu, partagez le 😉

 

Crédits photos : MickaelGaida

Continuer votre lecture :

Partager l'article
  •  
  •  
  •  
  •  
  •  
    26
    Partages
  • 26
  •  
  •  
  •  
  •  

4 commentaires

  1. Antoine Répondre

    Merci pour cet article. J’utilise beaucoup les différents joins de dplyr, mais je ne connaissais pas la fonction setequal() dont j’aurais souvent eu besoin !

  2. Eric Répondre

    Dans les parties 5 et 6, vous différenciez “visualiser” (avec semi_join et anti_join) et “créer” (avec intersect et setdiff)
    Ne peut on pas utiliser chaque fonction à la fois pour visualiser et créer ? Si oui, quelle différence dans les résultats obtenus ?

  3. KOUASSI KOFFI AYMAR Répondre

    merci Claire pour ce beau travail et surtout de mettre à notre disposition les résumés de ton connaissance. merci bien

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *