Data Step

Transformation de données SAS : Passer du format "Long" au format "Large" et tris personnalisés

Simon 9 vistas

ors de la manipulation de données sous SAS©, il est fréquent de devoir réorganiser la structure d'une table. Un cas classique est la conversion d'un jeu de données où les catégories sont listées en lignes (format "long") vers un format où ces catégories deviennent des colonnes distinctes (format "large" ou "wide").

Cet article explore comment effectuer cette transformation, calculer des sommes de manière robuste et appliquer une logique de tri complexe.

Le Scénario

Imaginons une table source nommée Population1 contenant des données démographiques par nation et par genre :

Transformation de données SAS : Passer du format "Long" au format "Large" et tris personnalisés -

L'objectif est d'obtenir une table Population2 structurée ainsi, avec une colonne pour le total et des colonnes distinctes pour chaque genre :

Transformation de données SAS : Passer du format "Long" au format "Large" et tris personnalisés -

Étape 1 : La Transposition des Données

Bien qu'il soit techniquement possible d'utiliser une étape DATA complexe avec des instructions RETAIN et des conditions, la méthode la plus efficace et la moins sujette aux erreurs repose sur la procédure TRANSPOSE.

Avant de transposer, il est impératif de trier les données par la variable de regroupement (ici, la Nation).

1/* 1. Tri préalable indispensable */
2PROC SORT DATA = population1;
3 BY Nation;
4RUN;
5 
6/* 2. Transposition */
7PROC TRANSPOSE DATA = population1 out = temp_pop(drop=_name_);
8 BY Nation; /* La ligne devient unique par Nation */
9 id Gender; /* Les valeurs de Gender deviennent les noms de colonnes */
10 var Number; /* Ce sont ces chiffres qui remplissent les colonnes */
11RUN;
À ce stade, la table contient les colonnes Nation, Men et Women.
Transformation de données SAS : Passer du format "Long" au format "Large" et tris personnalisés -

Étape 2 : Calcul du Total et Gestion des Valeurs Manquantes

Une fois les colonnes créées, nous devons calculer la population totale. Il existe une différence cruciale entre l'addition arithmétique simple et la fonction de somme sous SAS©.

L'approche naïve

1Population = Men + Women;
Si l'une des deux variables (Men ou Women) contient une valeur manquante (missing value), le résultat de l'opération sera également manquant

L'approche recommandée

1Population = sum(Men, Women);
La fonction SUM() ignore les valeurs manquantes (les traitant comme des zéros). Si l'on dispose des données pour les hommes mais pas pour les femmes, le total affichera tout de même le chiffre des hommes au lieu d'une valeur nulle, ce qui est généralement le comportement souhaité.

Étape 3 : Tri Personnalisé (Logique conditionnelle)

Supposons maintenant une contrainte de tri spécifique :

  1. Trier les nations par Population décroissante.

  2. Exception : Une nation spécifique (ex: "MyCountry") doit impérativement apparaître en dernière position, quel que soit son chiffre de population.

Pour réaliser cela sans modifier les données affichées, l'astuce consiste à créer une variable de tri temporaire (ou "rank").

La logique

Nous attribuons à cette variable de tri la valeur de la population pour toutes les nations, sauf pour l'exception, à laquelle nous attribuons une valeur artificiellement basse (par exemple -1).

1DATA population2;
2 SET temp_pop;
3
4 /* Calcul de la somme robuste */
5 Population = sum(Men, Women);
6 
7 /* Création de la variable de tri temporaire */
8 IF Nation = "MyCountry" THEN SortKey = -1;
9 ELSE SortKey = Population;
10RUN;
11 
12/* Tri final sur la clé temporaire */
13PROC SORT DATA = population2;
14 BY descending SortKey;
15RUN;
16 
17/* Nettoyage final : on retire la clé de tri */
18DATA population2;
19 SET population2(drop=SortKey);
20RUN;

Pour transformer efficacement une table :

  1. Utilisez PROC SORT puis PROC TRANSPOSE avec une instruction ID pour pivoter les lignes en colonnes.

  2. Privilégiez la fonction SUM() à l'opérateur + pour éviter la propagation des valeurs manquantes.

  3. Pour des tris complexes (comme forcer une ligne en bas de tableau), créez une variable technique temporaire, triez sur celle-ci, puis supprimez-la.