Lors d’une étude statistique ou d’une étude d’analyse de données, l’étape la plus importante est l’étape de préparation des données. Jusque là, nous n’avons eu à traiter qu’un seul dataframe à la fois. Cependant, dans la réalité, il est quand même peu courant que ce cas de figure arrive : il y a généralement plusieurs tableaux de données qu’il va falloir croiser, concaténer, agréger, etc.
Dans ce chapitre, nous allons nous intéresser un peu plus en détail à cette notion de concaténation de plusieurs jeux de données.
Concaténez plusieurs tableaux
Cette concaténation peut être vue de deux façons différentes :
soit de façon "verticale", c’est-à-dire en mettant les tableaux l’un en dessous de l’autre (juxtaposition de lignes, cf. cas 1 ci-dessous) ;
soit de façon "horizontale", c’est-à-dire en mettant les tableaux l’un à côté de l’autre (juxtaposition des colonnes, cf. cas 2 ci-dessous).
Voilà comment on pourrait schématiser cela avec deux tableaux (matrice ou dataframe) X
etY
:

Concaténation par ligne
Afin d’effectuer une concaténation selon les lignes des tableaux X et Y, nous utilisons la fonction rbind
:
Z <- rbind(X,Y)
Il faut donc que X et Y aient le même nombre de colonnes. Cependant, la logique est un peu différente selon que l’on concatène deux matrices ou deux dataframes. Illustrons ceci avec un exemple. Construisons d’abord une matrice avec ses identifiants de ligne et les noms des variables X1
et X2
:
X <- matrix(c(1,2,3,4),2,2)
rownames(X) <- paste("ligne",1:2,sep="")
colnames(X) <- paste("X",1:2,sep="")
X
# X1 X2
# ligne1 1 3
# ligne2 2 4
De même pour la matrice Y
:
Y <- matrix(11:16,3,2)
colnames(Y) <- paste("Y",1:2,sep="")
Y
# Y1 Y2
# [1,] 11 14
# [2,] 12 15
# [3,] 13 16
Concaténons à présent ces deux matrices en une seule :
Z <- rbind(X,Y)
Z
# X1 X2
# ligne1 1 3
# ligne2 2 4
# 11 14
# 12 15
# 13 16
Sur cet exemple, R concatène les matrices en ne retenant que le nom des individus (ou lignes ou row.names) de la première matrice.
Si l’on utilise deux dataframes de structure identique, un message d’erreur apparaît dès que les noms des variables sont différents :
x <- c("A","B","C","A")
y <- 1:4
mondf <- data.frame(x,y)
mondf
# x y
# 1 A 1
# 2 B 2
# 3 C 3
# 4 A 4
mondf2 <- data.frame("C",1)
mondf2
# X.C. X1
# 1 C 1
rbind(mondf,mondf2)
# Error in match.names(clabs, names(xi)) :
# les noms ne correspondent pas aux noms précédents
Il est donc nécessaire de changer le nom des variables de l’un des dataframes pour pouvoir les concaténer :
mondf2 <- data.frame(x="C",y=1)
rbind(mondf,mondf2)
# x y
# 1 A 1
# 2 B 2
# 3 C 3
# 4 A 4
# 5 C 1
Concaténation par colonne
La concaténation par colonnes se fait à l’identique pour les matrices ou les dataframes. La fonction permettant la concaténation (cbind
) ne vérifie pas les noms des lignes. En revanche, seuls les noms du premier tableau sont conservés :
mondf3 <- data.frame(taille=c(182,170,172,194),age=c(22,18,33,25))
cbind(mondf,mondf3)
# x y taille age
# 1 A 1 182 22
# 2 B 2 170 18
# 3 C 3 172 33
# 4 A 4 194 25
cbind(mondf3,mondf)
# taille age x y
# 1 182 22 A 1
# 2 170 18 B 2
# 3 172 33 C 3
# 4 194 25 A 4
Ce type de concaténation, en lignes ou en colonnes, n’est cependant pas le seul envisageable. En effet, le cas où vous devez concaténer deux tableaux ayant des structures (colonnes ou lignes) similaires est finalement assez rare en pratique. Généralement, vous allez plutôt avoir deux tableaux ayant une ou deux variables en lien, mais qui ne contiennent pas les mêmes informations.
Par exemple, si vous faites une analyse statistique impliquant des données marketing, vous pourrez avoir un tableau contenant les données physiologiques des clients (âge, sexe, etc.) et un autre contenant leurs données dites comportementales (produit acheté, quand, à quel prix, etc.). Vous souhaitez pouvoir créer un seul tableau permettant de mettre en relief ces deux informations, mais les deux tableaux ne font pas forcément la même taille, que ce soit en termes de lignes ou de colonnes : dans ce cas, les fonctions de concaténation ne s’appliquent pas ! Pas de panique, R permet de fusionner deux tableaux selon une clé (une variable commune entre les deux tableaux), grâce à l’ordre classique merge
.
Fusionnez plusieurs dataframes
Si nous reprenons l’exemple ci-dessus, le résultat que l’on souhaite obtenir sera :

Pour faire cela, on utilise la fonction merge
. Reprenons l’exemple précédent, en créant un tableau de plus petite taille, pour le fusionner avec le dataframe mondf
:
mondf4 <- data.frame(x=c("A","A","D"),taille=seq(180,190,by=5))
mondf4
# x taille
# 1 A 180
# 2 A 185
# 3 D 190
Nous souhaitons fusionner ces deux tableaux mondf
et mondf4
en un seul où seront répétées les caractéristiques de x
, la variable commune aux deux tableaux :
merge(mondf,mondf4)
# x y taille
# 1 A 1 180
# 2 A 1 185
# 3 A 4 180
# 4 A 4 185
La clé x
est alors la première colonne du jeu de données et par défaut, R ne conserve que les valeurs communes : c’est ce que l’on appelle un inner join ou jointure interne.
Il existe trois types de jointures principaux :
La jointure interne : ne garde que les valeurs de la clé qui sont à la fois dans la première et la seconde table. C’est la jointure de base réalisée par la fonction
merge
.La jointure à droite ou à gauche : garde toutes les valeurs de la clé de la première (jointure à gauche) ou de la deuxième table (jointure à droite). Si ces valeurs se retrouvent dans l’autre table, il complète avec les informations, comme lors d’une jointure interne ; sinon, les valeurs non renseignées sont remplacées par des
NA
. Pour faire cela, il faut préciser les argumentsall.x=T
dans le cas d’une jointure à gauche, etall.y=T
dans le cas d’une jointure à droite.La jointure externe : garde toutes les valeurs des clés des deux tables, même si elles n’apparaissent pas dans l’autre table. L’ensemble des valeurs non renseignées dans l’autre table sont remplacées par des
NA
. Pour cela, il faut utiliser l’argumentall=T
.
Voilà par exemple une jointure externe entre mondf et mondf4 :
merge(mondf,mondf4,all=TRUE)
# x y taille
# 1 A 1 180
# 2 A 1 185
# 3 A 4 180
# 4 A 4 185
# 5 B 2 NA
# 6 C 3 NA
# 7 D NA 190
Comme signifié précédemment, l’ensemble des valeurs correspondant aux clés non présentes dans l’une des deux tables ont été remplacées par des NA
.
En résumé
Lorsque vous avez plusieurs tableaux que vous souhaitez rassembler pour faciliter l’analyse, vous pouvez :
les concaténer par ligne s’ils ont le même nombre de colonnes ;
les concaténer par colonne s’ils ont le même nombre de lignes ;
les fusionner s’ils ont une variable en commun, appelée clé. Par ailleurs, il existe principalement quatre types de jointures différentes : la jointure interne, la jointure à droite, la jointure à gauche et la jointure externe.
Vous êtes à présent au point sur les manipulations de bases applicables aux dataframes ! Dans le prochain chapitre, nous allons voir une notion bien différente mais non moins nécessaire qui consiste à générer des nombres aléatoires avec R.