I coverted a regular code (below) into a macro that will produce either the frequency report or the descriptive
statistics report based on a value of a parameter that is passed to the macro.*/;
Original code
/*frequency report for month*/;
proc means data=VIRGINIAKEY N ; var month; class month;run;
/*lists basic descriptive statistics (N, mean, standard deviation, minimum, and maximum) for air temperature*/;
proc means data=VIRGINIAKEY ; var AirTemp; run;
Myy Current trial code:
%macro freq_Describe (MNTH=month, AIR_Temp=AirTemp );
/*frequency report for month*/;
proc means data=VIRGINIAKEY N ; var &MNTH.; class &MNTH.;run;
/*lists basic descriptive statistics (N, mean, standard deviation, minimum, and maximum) for air temperature*/;
proc means data=VIRGINIAKEY ; var &AIR_Temp.; run;
%mend freq_Describe;
%freq_Describe (MNTH=month , AIR_Temp=AirTemp);
Is there a way to
A) add a parameter to the macro that can control which variable is used for the report and
B) add titles that reflect the type of report (frequency or descriptive statistics) including a short description of the variable (specifying the description of the variable as a parameter for the macro)?
Any advice will be appreciated.
What is the purpose of writing such convoluted code?
%macro rpt/parmbuff;
%let dsname = %scan(&syspbuff,1,(,));
%let title = %scan(&syspbuff,2,(,));
%let proc = %scan(&syspbuff,3,(,));
%let cls = %scan(&syspbuff,4,(,));
%let var = %scan(&syspbuff,5,(,));
%let stats = %scan(&syspbuff,6,(,));
Just define the parameters in the %MACRO statement itself.
%macro rpt(dsname,title,proc,cls,var,stats);
Of course you can.
It looks like you already know how to add parameters to a macro. Next, you need to decide which parameters you want to add ... what the names of them will be and what the values will be that can be assigned to these parameters.
Then you need to learn about %IF %THEN statements so the macro can use those parameters to control the results and titles.
Note that this is a good learning exercise. However, it is a poor choice for anything more than that. You are better off writing PROC MEANS as needed instead of trying to convert your code to a macro. Macros do not add to your knowledge of SAS. Just the opposite. They reduce your chance to become more familiar with the software by writing the program for you. At this point, you would learn more by writing PROC MEANS yourself and postponing learning about macros.
Here's an example of something you might do!
%macro rpt(dsname,title,proc,cls,var,stats);
ods noproctitle;
title &title.;
options nolabel;
%if &proc.="means" %then %do;
proc means data=&dsname. nonobs &stats.;
class &cls.;
var &var.;
run;
%end;
%else %if &proc.="freq" %then %do;
proc freq data=&dsname.;
tables &var.(&cls.) / &stats.;
run;
%end;
%mend rpt;
*(dataset_name,"title","means/freq",class_vars,summary_vars,statistics/options);
%rpt(sashelp.cars, "My Means Summary!", "means", make, mpg_city, n std)
%rpt(sashelp.cars, "My Freq Summary!", "freq", make, mpg_city, nocol norow)
-unison
What is the purpose of writing such convoluted code?
%macro rpt/parmbuff;
%let dsname = %scan(&syspbuff,1,(,));
%let title = %scan(&syspbuff,2,(,));
%let proc = %scan(&syspbuff,3,(,));
%let cls = %scan(&syspbuff,4,(,));
%let var = %scan(&syspbuff,5,(,));
%let stats = %scan(&syspbuff,6,(,));
Just define the parameters in the %MACRO statement itself.
%macro rpt(dsname,title,proc,cls,var,stats);
Thanks a lot for your efforts
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.