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.
Background Colour
Font Face
Font Kerning
Image Visibility
Line Height
Link Highlight
Text Alignment
Font Size
Letter Spacing
Text Colour
Paragraph Width