DATA Step, Macro, Functions and more

Macro Usage

Reply
Super Contributor
Posts: 1,041

Macro Usage

     Hi Team,

I have a Macro but I am not knowing how to use it in this kind of situation.

The difference I am not getting is that how can I get Means side by side for example: type b type h and typec

i am able to get the result if any one variable is present but here three variables are side by side for which we have to produce Means and freqs..

I will post the code

Also how do I get the Total variable twiceone is a subtotal and the other is a grand total

THANKS

                   Type(b/h)                     Total           typec     TOTAL

                       b               h                                  

Age, years          n=?        n=?               n= ?         n=?                 n=?                 

Mean (SD)        46(13)       34(5)   

Median           

Min-Max           13-45      45-60          

BMI

Mean (SD)           

Median           

Min-Max            

Diabetes           

Smoking        

current          40(40%)   60(60%)

Former          60(60%)    40(40%)     

Gender

Male

Female           

HTN

yes

no           

Super Contributor
Posts: 1,041

Re: Macro Usage

Posted in reply to robertrao

Here is the code:

This macro creates a table of
charateristics for the variables listed.

It handles categorical, binary and continuous variables and produces and output
dataset that can be further customized. No statistical information is

included in this analysis

*/

/*Parameters to be set:

dsetin - name of dataset to be analyzed

cont = macro variable list of variable names, ie cont=age weight height

cat=list of categorical variables ie cat=sex grade

bin=binary variables, such as smoking now, smoking ever

dsetout=name of output dataset

Run example at the end for a
sample output dataset call sample_table_char in the work directory.

Based on the user formatting the variables the way the results should be and
with appropriate labels for variable names.

*/



*options mprint symbolgen;

%macro table_char(dsetin, cont, cat, bin, dsetout);



*delete old dataset;

proc datasets nodetails
nolist;

delete &dsetout;

quit;

/****************************************************************

Handle Categorical Variables

****************************************************************/

*loop through variable list;

%let i=1;

%do %while (%scan(&cat, &i, " ") ^=%str());

%let var=%scan(&cat, &i, " ");

*Get format for variable;

data _null_;

set &dsetin;

call symput("var_fmt", vformat(&var));

run;

proc freq data=&dsetin
noprint;

table &var/missing out=tab_var;

run;

data temp1;

length categorical $200.; format categorical $200.;

length value $200.; format value $200.;

set tab_var;

percent=percent/100;

categorical=put(&var., &var_fmt.);

if _n_=1 then do;

value=put(count, 8.)||"("||compress(put(percent,
percent8.1))||")";

order=2;

output;

order=1;

value='';

categorical=propcase(vlabel(&var.));

output;

end;

else do;

order=2;

value=put(count, 8.)||"("||compress(put(percent, percent8.1))||")";

output;

end;

keep categorical value order;

run;

proc sort data=temp1
out=temp2 (drop=order); by order categorical; run;



proc append base=&dsetout data=temp2;

run;

*clean up;

proc datasets nodetails
nolist;

delete tab_var temp1 temp2;

run; quit;

*Increment counter;

%let i=%eval(&i+1);

%end; *Categorical;

/****************************************************************

Handle Continuous Variables

****************************************************************/

%let i=1;

%do %while (%scan(&cont, &i, " ") ^=%str());

%let var=%scan(&cont, &i, " ");

proc means data=&dsetin
(rename=&var=vn) noprint;

var vn;

output out=table_var n= nmiss= mean= min= max= std= median= p25= p75=
p90=/autoname;

run;

*get label of variable for
clean reporting;

data _null_;

set &dsetin;

call symput("var_label", vlabel(&var));

run;



data temp1;

length categorical $200.; format categorical $200.;

format value $200.; length value $200.;

set table_var;

categorical="&var_label.";

value=.;

output;

categorical='Count(Missing)';

value=put(vn_n, 5.)||"("||compress(put(vn_nmiss,
5.))||")";

output;

categorical='Mean (SD)';

value=put(vn_mean, 8.1)||"("||compress(put(vn_stddev,
8.1))||")";

output;

categorical='Median (IQR)';

value=put(vn_median, 8.1)||"("||compress(put(vn_p25,
8.1))||" - "||compress(put(vn_p75, 8.1))||")";

output;

categorical='Range';

value=put(vn_min, 8.1)||" - "||compress(put(vn_max, 8.1));

output;

categorical='90th
Percentile';

value=put(vn_p90, 8.1);

output;

keep categorical value;

run;



proc append base=&dsetout data=temp1;

run;

*clean up;

proc datasets nodetails
nolist;

delete table_var temp1;

run; quit;

*Increment counter;

%let i=%eval(&i+1);

%end; *Continuous;

/*****************************************************************

Handle Binary Variables (only report 1s)

*****************************************************************/

%let i=1;

%do %while (%scan(&bin, &i, " ") ^=%str());

%let var=%scan(&bin, &i, " ");

proc freq data=&dsetin
noprint;

table &var/missing out=tab_var;

run;

data tab_var;

set tab_var;

where &var=1;

run;

data temp1;

length categorical $200.; format categorical $200.;

length value $200.; format value $200.;

set tab_var;

percent=percent/100;

if _n_=1 then do;

value=put(count, 8.)||"("||compress(put(percent,
percent8.1))||")";

order=1;

categorical=propcase(vlabel(&var.));

output;

end;

keep categorical value;

run;



proc append base=&dsetout data=temp1;

run;

*clean up;

proc datasets nodetails
nolist;

delete tab_var temp1;

run; quit;

*Increment counter;

%let i=%eval(&i+1);

%end;*Binary;


%mend table_char;

%table_char(sample, height weight age, sex age, female, sample_table_char);

Super Contributor
Posts: 1,041

Re: Macro Usage

Posted in reply to robertrao

HI Team

b h and c types are under the same variable

DO I need to subset b and c first with a where condition and use a class stmnt in the proc means and another proc means separately for typec? And merge themm both

I

AM confused

THanks

Ask a Question
Discussion stats
  • 2 replies
  • 219 views
  • 0 likes
  • 1 in conversation