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.
2
3
4
5
6
7
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() :
2
3
4
5
6
7
8
9
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 :
2
3
4
5
6
7
8
9
10
11
12
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 :
2
3
4
5
6
7
8
9
10
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."






