STT1682 – Progiciels en Statistique et Actuariat Cours 4 - Opérations Avancés Programmation en SAS Déclaration – IF/THEN (Conditions SAS) Pour effectuer des opérations SAS seulement si une ou plusieurs conditions sont respectés, on doit utiliser l'opération IF/THEN. Syntaxe #1 : IF CONDITION1 THEN OPERATION1; ELSE OPERATION2;*Le ELSE est facultatif; Si CONDITION1 est effectué, OPERATION1 sera exécuté sur la base de donnée, sinon OPERATION2 sera exécuté. Note: Si aucune opération est spécifiée, l'opération IF est traité comme une WHERE (tout ce qui ne répond pas à la condition n'est pas conservé dans la base de donnée) Exemple #1 : IF SEXE="M" THEN PRIME=PRIME*1.15; Déclaration – IF/THEN DO Pour effectuer un bloc d'opérations si la condition est respecté, on utilisera plutôt l'opération IF/THEN DO: Syntaxe #2 : IF CONDITION1 THEN DO; OPERATION1; OPERATION2; ... END; ELSE DO; OPERATION1; OPERATION2; ... END; Note : Ne pas oublier le END; à la fin de chaque bloc de conditons. David Langlois – notes STT1682 1 Exemple #2: IF SEXE="M" THEN DO; PRIME=PRIME*1.15; Message="Surcharge Homme"; END; ELSE DO; PRIME=PRIME*0.8; Message="Rabais Femme"; END; Déclaration – IF/ELSE IF Même si on peut effectuer plusieurs opérations IF, une à la suite de l'autre, il ne faut pas oublier que SAS va exécuté chacune d'entre elles sur chacune des observations de la base de donnée. Cependant, des fois certaines conditions ne seront jamais vrais si une autre condition est respectée. Par exemple : IF AGE=23 THEN PRIME=PRIME*1.10; IF AGE=24 THEN PRIME=PRIME*1.05; IF AGE=25 THEN PRIME=PRIME*1.00; ... Dans le code ci-dessous, si age=23, les autres lignes de codes deviennent inutiles, mais vont quand même être exécutés sur chacune des observations. Une façon plus efficace de coder serait d'utiliser l'opération IF/ELSE IF : Syntaxe #3 : IF CONDITION1 THEN OPERATION1; ELSE IF CONDITION2 THEN OPERATION2; ELSE IF CONDITION3 THEN OPERATION3; ... ELSE OPERATION4; Note: Peut aussi être utilisé avec l'opération THEN DO; Exemple #3: IF AGE=23 THEN PRIME=PRIME*1.10; ELSE IF AGE=24 THEN PRIME=PRIME*1.05; ELSE IF AGE=25 THEN PRIME=PRIME*1.00; David Langlois – notes STT1682 2 Déclaration ARRAY (Vecteurs SAS) Comme SAS exécute le code ligne par ligne, un vecteur pour lui est tout simplement un regroupement de variables et peut seulement contenir l'information d'une observation à la fois. L'utilisation des vecteurs sera donc pratique pour effectuer un traitement similaire à plusieurs variables facilement à l'aide d'une boucle au lieu de répeter plusieurs fois le même code. Syntaxe : ARRAY NOMVECTEUR[X] LENGTH LISTVARIABLES; La déclaration si-dessus va créer le vecteur NOMVECTEUR contenant X variables de longueur LENGTH et chacune de ces variables sont spécifié dans LISTVARIABLES Exemple #1: ARRAY NOM[3] $10 nom1 nom2 nom3; Le vecteur NOM composé des variables nom1, nom2 et nom3 (1e, 2e et 3e position) est créé où chacune des positions sera une chaîne de caractère de longueur 10. Exemple #2: ARRAY PRIME[*] PRIME1-PRIME10; Note - L'asterix sert à définir le vecteur suffisament grand pour contenir toutes les variables listés (10 dans cet exemple) - Le tiret peut être utilisé pour définir un groupe de variable contenant seulement un chiffre à la fin de différent (i.e. PRIME1, PRIME2, PRIME3...) Pour appeler une variable contenu dans un vecteur, on a qu'à écrire le vecteur avec la position de la variable désirée. Par exemple : NOM[1] peut être utilisé pour faire référence à la variable nom1. David Langlois – notes STT1682 3 Déclaration DO (Boucles SAS) Pour effectuer plusieurs opérations en chaîne, sur chacune des observations, il peut des fois être pratique d'utiliser une boucle SAS (Déclaration DO) Syntaxe : DO K=X TO Y BY Z; ... END; K=Nouvelle Variable créé qui sera incrémenté tout au long de la boucle X=Constante initiale pour commencer la boucle Y=Constante final où la boucle se terminera Z=Incrémentation entre chaque boucle (peut être négative) - Facultatif (1 par défaut) En résumé, la boucle DO va effectuer toutes les opérations contenus entre le DO et le END pour K allant de X jusqu'à Y par bond de Z. Exemple : X=0; DO K=10 TO 2 BY -2; X=X+K; END; Les boucles seront aussi très pratiques pour effectuer des opérations à l'aide de vecteurs Exemple #2 : PRIME_TOT=0; DO K=1 TO 10; PRIME_TOT=PRIME_TOT+PRIME[K] ; END; David Langlois – notes STT1682 4