Exercices_de_synthese_-_SAS_Macro
- Mobiliser, sur des cas complets, l'ensemble des notions vues dans les modules VIII à X
- Écrire des macro-programmes paramétrés qui produisent un résultat, une table ou un graphique
- Réutiliser sans les recopier des tables produites lors des exercices de synthèse SAS Base
Avant de commencer
Cette page contient le corrigé complet des exercices donnés en devoir à l'issue du bloc SAS Macro (devoirs 7 à 9), réalisés en direct le lundi 14 septembre entre 17h00 et 19h30. Elle reste masquée pendant que vous travaillez et n'est publiée qu'à la clôture du dépôt, à 19h30. Plusieurs exercices réutilisent des tables produites dans la page Exercices de synthèse — SAS Base (temperatures, electric, cars) : veillez à les avoir sauvegardées dans votre bibliothèque MALIB plutôt que dans WORK.
Exercice 1 — %PRINT
Voir le corrigé
%macro print(tab, varlist, n) ;
proc print data=&tab (obs=&n) noobs ;
var &varlist ;
run ;
%mend print ;
%print(sashelp.iris, sepallength, 5)
/* Avec une liste de variables, y compris via l'operateur -- qui selectionne */
/* toutes les variables de la table dans l'ordre entre les deux bornes */
%print(sashelp.iris, sepallength--petalwidth, 20)
L'opérateur
-- (double tiret) sélectionne toutes les variables de la table comprises, dans l'ordre de position, entre les deux bornes indiquées — pratique pour éviter de lister des dizaines de noms de variables consécutives.Exercice 2 — Deux derniers caractères
Voir le corrigé
%macro ext_char(mot) ;
%put %substr(&mot, %eval(%length(&mot)-1), 2) ;
%mend ext_char ;
%ext_char(IMIE)
/* Verification manuelle du mecanisme, sans macro-programme */
%put %substr(MARION, 5, 2) ;
%put %substr(MARION, %eval(%length(MARION)-1), 2) ;
Exercice 3 — %STATS
Voir le corrigé
%macro stats(lib, tab, var) ;
%let nom = %sysfunc(compress(&lib..&tab)) ;
proc means data=&nom mean std ;
var &var ;
output out=resultat mean=moyenne std=ecart ;
run ;
data _null_ ;
set resultat ;
call symput("MA_MOYENNE", moyenne) ;
call symput("MON_ECARTTYPE", ecart) ;
run ;
%put &MA_MOYENNE. ;
%put &MON_ECARTTYPE. ;
%mend stats ;
%stats(sashelp, iris, sepallength)
Alternative sans macro-langage, avec la clause
SELECT ... INTO : de la PROC SQL — une autre façon d'obtenir le même résultat, vue en détail dans le cours SAS SQL :
proc sql noprint ;
select mean(sepallength) into :moyenne_sql
from sashelp.iris ;
quit ;
%put &moyenne_sql. ;
Exercice 4 — %MOYENNE
Voir le corrigé
%macro moyenne(table, quanti, group) ;
proc means data=&table mean ;
var &quanti ;
class &group ;
output out=sortie mean=m ;
run ;
proc gplot data=sortie ;
plot m*&group ;
run ;
%mend moyenne ;
%moyenne(table=malib.temperatures, quanti=temp, group=year)
%moyenne(table=malib.temperatures, quanti=temp, group=month)
%moyenne(table=malib.temperatures, quanti=precp, group=year)
%moyenne(table=malib.temperatures, quanti=precp, group=month)
Ces quatre appels remplacent quatre blocs PROC MEANS + PROC GPLOT qui auraient dû être écrits à la main : c'est la démonstration la plus parlante de l'intérêt du macro-langage.
Exercice 5 — %FILTRE
À réaliser après avoir vu l'exercice 7 (factures d'électricité) des exercices de synthèse SAS Base.
Voir le corrigé
%macro filtre(donnees=, var=, a=, b=, liste=) ;
data resultat ;
set &donnees ;
if ((&a > &var) or (&b < &var)) then delete ;
run ;
proc print data=resultat ;
var &liste ;
run ;
%mend filtre ;
%filtre(donnees=malib.electric, var=bill, a=150, b=200, liste=year month bill)
Exercice 6 — %LISTE
Voir le corrigé
proc sort data=sashelp.prdsale (keep=product) out=produits nodupkey ;
by product ;
run ;
%macro liste ;
data _null_ ;
set produits ;
call symput("PRODUIT_"||compress(_n_), product) ;
call symput("OBS", _n_) ;
run ;
%do i=1 %to &OBS ;
%put PRODUIT_&i. : &&PRODUIT_&i. ;
%end ;
%mend liste ;
%liste
Voir le corrigé
%macro liste(type=) ;
proc sort data=sashelp.prdsale (where=(prodtype="&type.") keep=prodtype product)
out=produits nodupkey ;
by product ;
run ;
data _null_ ;
set produits ;
call symput("PRODUIT_"||compress(_n_), product) ;
call symput("OBS", _n_) ;
run ;
%do i=1 %to &OBS ;
%put &type. - PRODUIT_&i. : &&PRODUIT_&i. ;
%end ;
%mend liste ;
%liste(type=FURNITURE)
%liste(type=OFFICE)
Exercice 7 — %PRIX_MOYEN
Utilise la table cars produite à l'exercice 1 (question 1) des exercices de synthèse SAS Base.
Voir le corrigé
%macro prix_moyen(marque=, modele=) ;
proc means data=malib.cars (where=(make="&marque" and model="&modele")) mean ;
var price ;
run ;
%mend prix_moyen ;
%prix_moyen(marque=Buick, modele=Lacrosse)
Exercice 8 — %DEVINEZ
Voir le corrigé
/* Tirage du nombre a deviner */
%let alea = %eval(%sysfunc(int(%sysevalf(%sysfunc(rand(uniform))*10))) + 1) ;
%put &alea ;
%let nb_coups = 0 ;
%macro devinez(nb=) ;
%if &nb < &alea %then %do ;
%put Plus grand ;
%let nb_coups = %eval(&nb_coups + 1) ;
%end ;
%else %if &nb > &alea %then %do ;
%put Plus petit ;
%let nb_coups = %eval(&nb_coups + 1) ;
%end ;
%else %do ;
%put BRAVO ! Trouve en &nb_coups coups. ;
%end ;
%mend devinez ;
%devinez(nb=5)
%devinez(nb=3)
%devinez(nb=7)
Comme dans l'exercice du module X sur ce même thème, le compteur NB_COUPS doit être déclaré en dehors du macro-programme (environnement GLOBAL) pour survivre d'un appel à l'autre.
Couleur de fond
Police
Crénage de la police
Visibilité de l’image
Hauteur de ligne
Surbrillance de lien
Alignement du texte
Taille de police
Espacement des lettres
Couleur de texte
Largeur de paragraphe