Manipulation de tables : L'art de la Fusion et de la Concaténation (MERGE et SET)

Si vous travaillez dans la Data depuis plus de trois jours, vous avez sûrement remarqué une vérité universelle : les données dont vous avez besoin ne se trouvent jamais dans un seul et même fichier. Le comptable a les prix dans un tableau Excel, la caisse enregistre les quantités vendues dans un fichier texte, et les RH gèrent les plannings sur un vieux logiciel en noir et blanc.

Votre mission, si vous l'acceptez, est de réconcilier tout ce beau monde. Dans le chapitre 4 de son guide, Neil Spencer nous explique que SAS propose deux grandes méthodes pour combiner des tables : on peut les empiler les unes sur les autres (Concaténation) ou les coller côte à côte (Fusion) {A98989CA}.pdf].

Sortez vos rouleaux à pâtisserie, on va faire de la pâte à données !

1. L'instruction SET : Empiler les crêpes (Concaténation)

La concaténation est l'opération la plus simple. Elle consiste à prendre une table B et à venir l'ajouter à la toute fin d'une table A. C'est l'équivalent d'un "Copier-Coller à la suite" {A98989CA}.pdf].

Imaginons que notre boulangerie possède deux fichiers de ventes distincts : un pour le matin, et un pour l'après-midi. Nous voulons créer un fichier unique pour la journée complète. L'instruction magique ici est SET.

SAS


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* Auteur : Nicolas Housset
Objectif : Concaténer deux tables avec l'instruction SET */


* Création rapide de nos deux tables de base pour l'exemple ;
DATA ventes_matin;
INPUT produit $15. quantite;
DATALINES;
Croissant 45
Pain_Chocolat 30
Baguette 120
;
RUN;

DATA ventes_aprem;
INPUT produit $15. quantite;
DATALINES;
Baguette 85
Tarte_Citron 12
Flan 8
;
RUN;

* -- LA CONCATÉNATION -- ;
DATA ventes_journee;
* On liste simplement les tables à empiler après l'
instruction SET ;
SET ventes_matin ventes_aprem;
RUN;

PROC PRINT DATA = ventes_journee;
TITLE "Bilan complet de la journée";
RUN;

Que se passe-t-il si les tables n'ont pas exactement les mêmes colonnes ? C'est la beauté de SAS : il gère ça très bien ! Si la table de l'après-midi possède une colonne "Promo" qui n'existe pas le matin, SAS va tout de même empiler les tables. Il mettra simplement une valeur manquante (un point . pour les chiffres, ou un espace blanc pour le texte) dans la colonne "Promo" pour toutes les lignes du matin {A98989CA}.pdf].

2. L'instruction MERGE : Le mariage des données (Fusion)

Empiler, c'est bien, mais souvent, on veut enrichir nos données. Par exemple, notre table ventes_journee contient les quantités, mais pas les prix ! Ces prix se trouvent dans un autre fichier, notre catalogue_prix.

Pour calculer notre chiffre d'affaires, nous devons ramener le prix en face de chaque produit. C'est une jointure (ou fusion), et cela se fait avec l'instruction MERGE associée à l'instruction BY (la clé de jointure) {A98989CA}.pdf].

⚠️ ALERTE ROUGE : Le videur de la boîte de nuit (PROC SORTLa PROC SORT est une procédure SAS permettant de réorganiser les observations d'une table selon l'ordre croissant ou décroissant d'une ou plusieurs variables, tout en supprimant les doublons.)

Avant de faire un MERGE en SAS, il y a une règle absolue, sacrée et inviolable : Vos tables DOIVENT être triées selon la variable clé. Si vous essayez de fusionner des tables non triées, SAS va stopper net le programme, écrire une insulte en rouge dans la Log et refuser de travailler.

La procédure PROC SORTLa PROC SORT est une procédure SAS permettant de réorganiser les observations d'une table selon l'ordre croissant ou décroissant d'une ou plusieurs variables, tout en supprimant les doublons. est donc le passage obligé {A98989CA}.pdf].

SAS


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* 1. Création de notre table de référence (le catalogue) */
DATA catalogue_prix;
INPUT produit $15. prix_unitaire;
DATALINES;
Baguette 1.10
Croissant 1.20
Flan 2.50
Pain_Chocolat 1.30
Tarte_Citron 3.50
;
RUN;

/* 2. LE TRI OBLIGATOIRE avant toute fusion */
* On trie les ventes par ordre alphabétique des produits ;
PROC SORT DATA = ventes_journee;
BY produit;
RUN;

* On trie le catalogue par ordre alphabétique des produits ;
PROC SORT DATA = catalogue_prix;
BY produit;
RUN;

/* 3. LA FUSION */
DATA ventes_enrichies;
* On fusionne nos deux tables ;
MERGE ventes_journee catalogue_prix;
* On précise à SAS quelle est la colonne commune qui sert de lien ;
BY produit;

* Maintenant qu'on a la quantité ET le prix sur la même ligne, on calcule ! ;
chiffre_affaires = quantite * prix_unitaire;
RUN;

PROC PRINT DATA = ventes_enrichies;
TITLE "
Ventes détaillées avec Chiffre d'Affaires";
RUN;

3. Les subtilités du MERGE (Pour aller plus loin)

Dans notre exemple parfait, tous les produits vendus existaient dans le catalogue. Mais que se passe-t-il si un vendeur a tapé "Croisant" au lieu de "Croissant" ? SAS va créer une ligne pour "Croisant" avec la quantité vendue mais un prix manquant, ET une ligne pour "Croissant" avec le prix du catalogue mais une quantité manquante.

Dans un prochain tutoriel avancé, nous aborderons les options de la variable automatique IN= qui permet de faire des jointures strictes (Inner Join, Left Join), comme en SQL, pour filtrer ces cas particuliers.

Pour le moment, célébrez cette victoire : vous savez transformer des petits fichiers éparpillés en une base de données robuste ! Le mois prochain, on s'attaque au monument des étapes DATA : la restructuration avancée avec les tableaux (Arrays). Accrochez-vous, ça va secouer !

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.