BookmarkSubscribeRSS Feed
robertrao
Quartz | Level 8

     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           

2 REPLIES 2
robertrao
Quartz | Level 8

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);

robertrao
Quartz | Level 8

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

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 2 replies
  • 803 views
  • 0 likes
  • 1 in conversation