%macro calc_freq(din=dat_1, var=, rowlbl=, fmt=, rows=, denomdsn=denom, ord1=, whr=, dsnout= ); proc sort data=&din out=nodup_&dsnout nodupkey; by trtn usubjid &var; &whr; run; proc freq data=nodup_&dsnout noprint; tables &var / out=fq&ord1; by trtn trt; &whr; run; data pct&ord1; merge &denomdsn.(in=a) fq&ord1.(in=b); by trtn trt; if a and b; length str1 $20; pct=(count/bign)*100; if pct=100 then str1=strip(put(count, best.))||' (100)'; else if nmiss(bign, count)=0 then str1=strip(put(count, best.))||' ('||strip(put(pct, 8.1))||')'; else str1='0'; run; proc sort data=pct&ord1; by &var trtn trt; run; proc transpose data=pct&ord1 out=pct&ord1.t(drop=_:) prefix=col; var str1; by &var; id trtn; run; %if &rows ne %then %do; data allrows; do &var=&rows; output; end; run; data pct&ord1.t; merge pct&ord1.t(in=a) allrows(in=b); by &var; if b; run; %end; data &dsnout; set allcols(obs=0) pct&ord1.t; length rowlbl $100; cat=&ord1; subcat=&var; rowlbl=put(&var, &fmt..); array allcols{*} col:; do i=1 to dim(allcols); if allcols{i}='' then allcols{i}='0'; end; drop i; run; %if %length(&rowlbl) ne 0 %then %do; data hdr0; length rowlbl $200; rowlbl="&rowlbl"; cat=&ord1; subcat=0; run; data &dsnout; set hdr0 &dsnout; run; %end; %mend calc_freq; *%calc_freq(ord1=2, var=mcrit1mn, fmt=mcrit1f, rows=%str(2), rowlbl=%str(Systolic blood pressure (low)), whr=%str(where paramcd='SYSBP' and mcrit1mn=2), dsnout=summ02);