** read in ADSL ******; proc sort data=adam.adsl out=adsl0(keep=usubjid subjid saffl age sex actarm trt01pn); by usubjid saffl; where saffl='Y'; run; proc sort data=adam.adae out=adae0; by usubjid trtemfl; where trtemfl='Y'; run; data adae1; merge adsl0(in=a) adae0(in=b keep=usubjid aebodsys aedecod aeterm trtemfl); by usubjid; if a; if aebodsys='' then aebodsys='UNCODED'; if aedecod='' then aedecod=strip(aeterm);; run; data adae2; set adae1; run; *** denom dataset ****; proc sort data=adae2 out=adae2_nd nodupkey; by trtan usubjid; run; proc freq data=adae2_nd noprint; tables trtan / out=denom(rename=(count=bign)); run; data _null_; set denom; call symput('n'||strip(put(trtan, best.)), strip(put(bign, best.))); run; %macro calc_freq(din=, var=, ord=); /* %let rowlbl=AE; %let ord=1; %let whr=%str(where aeterm ne ''); */ proc freq data=&din noprint; tables &var / out=fq⩝ run; data pct⩝ merge denom(in=a) fq⩝ by trtan; if a; length str1 $20; ord=⩝ if nmiss(bign, count)=0 then str1=strip(put(count, best.))||' ('||strip(put((count/bign)*100, 8.1))||')'; else str1='0'; run; %mend calc_freq; **** any TEAE *****; proc sort data=adae2 out=anypt nodupkey; by trtan usubjid; where aeterm ne ''; run; %calc_freq(ord=1, din=anypt, var=%str(trtan)); **** any aebodsys *****; proc sort data=adae2 out=anysoc nodupkey; by trtan aebodsys usubjid; where aeterm ne ''; run; %calc_freq(ord=2, din=anysoc, var=%str(trtan*aebodsys)); **** any PT *****; proc sort data=adae2 out=anypt nodupkey; by trtan aebodsys aedecod usubjid; where aeterm ne ''; run; %calc_freq(ord=3, din=anypt, var=%str(trtan*aebodsys*aedecod)); data allpct; set pct:; run; proc sort data=allpct; by ord aebodsys aedecod; run; proc transpose data=allpct out=summ01(drop=_:) prefix=col; var str1; id trtan; by ord aebodsys aedecod; run; **** get the soc order *****; proc sort data=pct2 out=socord(keep=aebodsys count rename=(count=socord)) nodupkey; by aebodsys; run; proc sort data=summ01; by aebodsys; run; data summ02; merge summ01(in=a) socord(in=b); by aebodsys; if a; if ord in (2 3) and aebodsys='' then delete; run; proc sort data=summ02; by descending socord aebodsys; run; data fin0; set summ02; by descending socord aebodsys; if first.aebodsys then ord2+1; length rowlbl $200; if ord=1 then do; rowlbl='Patients With at Least One TEAE'; *ptord=0; end; else if ord=2 then do; rowlbl=strip(aebodsys); *ptord=0; end; else if ord=3 then do; rowlbl=' '||strip(aedecod); ptord=input(scan(col4, 1), best.)*-1; end; if ord>1 then ord=2; if ord=1 then ord2=0; array allcols{*} col:; do i=1 to dim(allcols); if allcols{i}='' then allcols{i}='0'; end; run; proc sort data=fin0; by ord ord2 aebodsys ptord aedecod; run; data qcdata.&dsname.; set fin0; keep ord rowlbl col:; run;