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 :
L'objectif est d'obtenir une table Population2 structurée ainsi, avec une colonne pour le total et des colonnes distinctes pour chaque genre :
É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. Tri préalable indispensable */
proc sort data = population1;
by Nation;
run;
/* 2. Transposition */
proc transpose data = population1 out = temp_pop(drop=_name_);
by Nation; /* La ligne devient unique par Nation */
id Gender; /* Les valeurs de Gender deviennent les noms de colonnes */
var Number; /* Ce sont ces chiffres qui remplissent les colonnes */
run;
1
/* 1. Tri préalable indispensable */
2
PROC SORTDATA = population1;
3
BY Nation;
4
RUN;
5
6
/* 2. Transposition */
7
PROC TRANSPOSEDATA = 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 */
11
RUN;
À ce stade, la table contient les colonnes Nation, Men et Women.
Étape 2 : Calcul du Total et Gestion des Valeurs Manquantes
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
Population = sum(Men, Women);
1
Population = 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 :
Trier les nations par Population décroissante.
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).
data population2;
set temp_pop;
/* Calcul de la somme robuste */
Population = sum(Men, Women);
/* Création de la variable de tri temporaire */
if Nation = "MyCountry" then SortKey = -1;
else SortKey = Population;
run;
/* Tri final sur la clé temporaire */
proc sort data = population2;
by descending SortKey;
run;
/* Nettoyage final : on retire la clé de tri */
data population2;
set population2(drop=SortKey);
run;
1
DATA 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;
10
RUN;
11
12
/* Tri final sur la clé temporaire */
13
PROC SORTDATA = population2;
14
BY descending SortKey;
15
RUN;
16
17
/* Nettoyage final : on retire la clé de tri */
18
DATA population2;
19
SET population2(drop=SortKey);
20
RUN;
Pour transformer efficacement une table :
Utilisez PROC SORT puis PROC TRANSPOSE avec une instruction ID pour pivoter les lignes en colonnes.
Privilégiez la fonction SUM() à l'opérateur + pour éviter la propagation des valeurs manquantes.
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.
Wichtiger Haftungsausschluss
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.