*Slide 9; data hsb2; input id female race ses prog read write math science socst; datalines; 70 0 4 1 1 57 52 41 47 57 121 1 4 2 3 68 59 53 63 61 86 0 4 3 1 44 33 54 58 31 141 0 4 3 3 63 44 47 53 56 172 0 4 2 2 47 52 57 53 61 113 1 4 2 2 44 52 51 63 61 50 0 3 2 1 50 59 42 53 61 11 0 1 2 2 34 46 45 39 36 84 0 4 2 1 63 57 54 51 63 48 1 3 2 2 57 55 52 50 51 75 1 4 2 3 60 46 51 53 61 60 1 4 2 2 57 65 51 63 61 95 0 4 3 2 73 60 71 61 71 104 0 4 3 2 54 63 57 55 46 38 0 3 1 2 45 57 50 31 56 115 0 4 1 1 42 49 43 50 56 76 0 4 3 2 47 52 51 50 56 195 0 4 2 1 57 57 60 56 52 ; run; %macro printsubset(gender,titletext); proc print; where female=&gender; title "&titletext"; run; %mend printsubset; %printsubset(1,Female Students) %printsubset(0,Male Students) /* Slides 16 through 18 */ /* Macro comment vs regular comment */ options mprint mlogic symbolgen; %macro printsubset(gender,titletext); proc print; %*FEMALE is actually a gender indicator--this statement will not be executed; *This statement will be executed; where female=&gender; title "&titletext"; run; %mend printsubset; %printsubset(1,Female Students) *Slide 23; /* The regsimp macro */ %macro regsimp(dep=,indep=); proc reg data=hsb2; model &dep=&indep; run; %mend; %regsimp(dep=read,indep=write); /* Mixed parameters */ %macro regsimp(dep,indep=); proc reg data=hsb2; model &dep=&indep; run; %mend; /*Simple linear regression */ %regsimp(read,indep=write); /* Regression with no independent variable */ /* This should print the sample mean and */ /* variance and the one-sample t test */ %regsimp(read); * Slide 24; /* Creating three data sets (one for each SES level) */ data seslow; set hsb2; where ses=1; run; data sesmed; set hsb2; where ses=2; run; data seshigh; set hsb2; where ses=3; run; %macro printsesgroup / parmbuff; %put Syspbuff contains: &syspbuff; %local num; %do num=1 %to %sysfunc(countw(&syspbuff)); %let dsname=%scan(&syspbuff,&num); proc print data=&dsname; run; %end; %mend printsesgroup; %printsesgroup(seslow) %printsesgroup(seslow, seshigh) %printsesgroup(seslow, sesmed, seshigh) *Slide 32; *%IF demo; data todate; input transaction $20. @22 date mmddyy10. debit credit; datalines; Dues 9/30/2007 . 25.00 Dues 9/30/2007 . 25.00 Dues 12/31/2007 . 50.00 Postage 11/1/2007 93.45 . Receipt-Caryn 10/30/2007 261.30 . ; run; data all; input transaction $20. @22 date mmddyy10. debit credit; datalines; Dues 9/30/2007 . 25.00 Dues 9/30/2007 . 25.00 Dues 12/31/2007 . 50.00 Postage 11/1/2007 93.45 . Receipt-Caryn 10/30/2007 261.30 . Dues 3/31/2008 . 25.00 Postage 5/1/2007 92.68 . Dues 6/30/2008 . 25.00 ; run; %macro fiscal(report); %if %upcase(&report)=FY %then %do; title 'Fiscal Year Debits and Credits'; proc means data=all; var debit credit; run; %end; %else %do; title 'To-Date Debits and Credits'; proc means data=todate; var debit credit; run; %end; %mend fiscal; %fiscal(FY) *%IF demo to insert text; %macro dembplot(var,group=); proc sgplot data=hsb2; title "Boxplot of &var"; vbox &var %if &group ne %then %do; /category=&group datalabel=id; %end; %else %do; /datalabel=id; %end; run; %mend; %dembplot(read,group=female); %dembplot(write); *Refinement of above code; %macro dembplot(var,group=); proc sgplot data=hsb2; title "Boxplot of &var"; vbox &var /datalabel=id %if &group ne %then %do; category=&group %end; ; run; %mend; %dembplot(read,group=female); %dembplot(write); *Slide 34; *Simple example of %DO; title; options nomlogic nomprint nosymbolgen; data a; array x x1-x100; do i=1 to 10; do over x; x=rannor(0); end; output; end; run; %macro rename; data b; set a; %do i=1 %to 100; drop x&i; y&i=x&i; %end; run; %mend rename; %rename proc sql outobs=5; select * from a; select * from b; quit; *Slide 35; * Example of %DO and %EVAL; /* The regall macro */ %macro regall(dep=,indep=); %local k indx; %let k=1; %let indx=%scan(&indep,&k); %do %while("&indx" ne ""); proc reg data=hsb2; model &dep=&indx; run; %let k=%eval(&k+1); %let indx=%scan(&indep,&k); %end; %mend; %regall(dep=read,indep=write math female socst); * Difference between %eval and %sysevalf; * Example from SAS help; %let a=1+2; %let b=10*3; %let c=5/3; %let eval_a=%eval(&a); %let eval_b=%eval(&b); %let eval_c=%eval(&c); %put &a is &eval_a; %put &b is &eval_b; %put &c is &eval_c; * compare to %sysevalf; %let a=1+2; %let b=10*3; %let c=5/3; %let eval_a=%sysevalf(&a); %let eval_b=%sysevalf(&b); %let eval_c=%sysevalf(&c); %put &a is &eval_a; %put &b is &eval_b; %put &c is &eval_c; * Try %sysevalf with extra arguments; %let c=5/3; %let eval_c=%sysevalf(&c,boolean); %put &c is &eval_c; %let c=5/3; %let eval_c=%sysevalf(&c,ceil); %put &c is &eval_c; %let c=5/3; %let eval_c=%sysevalf(&c,floor); %put &c is &eval_c; %let c=5/3; %let eval_c=%sysevalf(&c,integer); %put &c is &eval_c;