SAS - Création conditionnelle de variables dans l'étape DATA

Cet article en deux mots :

Apprenez à donner de l'intelligence à vos programmes SAS grâce aux instructions conditionnelles. De la structure IF-THEN aux blocs DO-END, ce guide vous explique comment automatiser vos prises de décisions tout en évitant le bug redoutable des valeurs manquantes pour des données toujours fiables.

Bonjour à tous et bienvenue dans le deuxième volet de notre grande série dédiée à l'étape DATA de SAS®.

Dans notre premier article, nous avons vu comment importer l'inventaire de notre réseau de concessionnaires et calculer un prix TTC. Mais dans la vraie vie, on applique rarement la même règle à toutes nos données de manière uniforme. Un véhicule neuf ne se traite pas comme un véhicule d'occasion, et une berline allemande n'aura pas le même plan de révision qu'une citadine française.

C'est ici qu'entre en jeu l'intelligence de notre programme : la logique conditionnelle.

Aujourd'hui, nous allons apprendre à SAS comment "prendre des décisions" grâce aux instructions conditionnelles.

1. Le grand classique : IF-THEN / ELSE

L'instruction IF-THEN (Si - Alors) est la base de la logique conditionnelle. Elle permet d'exécuter une action uniquement si une condition spécifique est remplie. L'instruction ELSE (Sinon) permet de gérer tous les autres cas.

Imaginons que nous recevons les données de kilométrage de nos véhicules d'occasion. Nous voulons créer une variable etat_usure pour aider nos vendeurs.

1
2
3
4
5
6
7
data vehicules_categories;
set parc_auto; /* Notre table de l'article précédent */

if kilometrage > 150000 then etat_usure = 'Fort';
else if kilometrage > 50000 then etat_usure = 'Moyen';
else etat_usure = 'Faible';
run;

Ici, SAS lit la table ligne par ligne. Dès qu'une condition est vraie, il applique la valeur et passe à la ligne suivante, ignorant les else if restants.

2. Attention au grand piège de SAS : Les valeurs manquantes

Le code ci-dessus semble parfait... et pourtant, il contient un bug redoutable très connu des programmeurs SAS !

Que se passe-t-il si le kilométrage d'une voiture n'a pas été renseigné (valeur manquante) ? Dans SAS, une valeur numérique manquante est représentée par un point (.) et est considérée comme la valeur la plus petite possible (infiniment négative).

Donc, si le kilométrage est manquant, la condition kilometrage > 50000 est fausse, et le programme bascule dans le else, attribuant un état d'usure "Faible" à un véhicule dont on ne sait rien !

Voici comment corriger cela proprement avec la fonction MISSING() :

1
2
3
4
5
6
7
8
9
data vehicules_categories;
set parc_auto;

/* On gère l'inconnu en priorité ! */
if missing(kilometrage) then etat_usure = 'Inconnu';
else if kilometrage > 150000 then etat_usure = 'Fort';
else if kilometrage > 50000 then etat_usure = 'Moyen';
else etat_usure = 'Faible';
run;

3. Exécuter plusieurs actions avec DO ... END

Parfois, une seule action ne suffit pas. Si un véhicule a une usure "Forte", nous voulons non seulement l'indiquer, mais aussi créer une variable alerte_atelier et lui attribuer un budget de révision plus élevé.

Pour exécuter un bloc d'instructions sous une même condition, on encadre ces instructions avec DO et END :

1
2
3
4
5
6
7
8
9
10
11
12
data preparation_atelier;
set vehicules_categories;

if etat_usure = 'Fort' then do;
alerte_atelier = 'OUI';
budget_reparation = 1500;
end;
else do;
alerte_atelier = 'NON';
budget_reparation = 300;
end;
run;

4. L'alternative élégante : L'instruction SELECT

Lorsque vous avez de nombreuses conditions basées sur les valeurs exactes d'une seule et même variable, l'enchaînement de IF-THEN/ELSE peut devenir lourd à lire. C'est là que l'instruction SELECT brille.

Par exemple, classons nos véhicules par origine selon leur marque :

1
2
3
4
5
6
7
8
9
10
data origine_vehicules;
set parc_auto;

select (marque);
when ('PEUGEOT', 'RENAULT', 'CITROEN') origine = 'France';
when ('VOLKSWAGEN', 'AUDI', 'BMW') origine = 'Allemagne';
when ('FORD', 'CHEVROLET') origine = 'USA';
otherwise origine = 'Autre';
end;
run;

C'est propre, lisible, et très efficace ! Notez l'importance du otherwise (l'équivalent du else final) pour éviter une erreur si une marque inattendue (comme "TOYOTA") apparaît dans les données.

"Sur la route comme en programmation, c'est votre capacité à anticiper les intersections et à prendre la bonne direction qui détermine si vous arriverez à destination sans accident."

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.