/* Macro expand takes data set with y successes from n trials per row */ /* and expands it to have y rows with y=1 and n-y rows of y=0. */ /* */ /* Hugh Crews, June 2008 */ /* */ /* Example call: %expand(dataset=one,successes=y,trials=n); */ /* */ /* data one; */ /* input study $ trt $ y n; */ /* cards; */ /* solomon celeb 18 1356 */ /* solomon placebo 3 679 */ /* pfizer celeb 2 285 */ /* pfizer placebo 0 140 */ /* presap celeb 9 933 */ /* presap placebo 3 628 */ /* proc print; */ /* %include 'K:expand.binomial.data.txt'; */ /* %expand(dataset=one,successes=y,trials=n); */ /* proc print; */ /* */ /* Obs study trt y n */ /* */ /* 1 solomon celeb 18 1356 */ /* 2 solomon placebo 3 679 */ /* 3 pfizer celeb 2 285 */ /* 4 pfizer placebo 0 140 */ /* 5 presap celeb 9 933 */ /* 6 presap placebo 3 628 */ /* */ /* Obs study trt y */ /* */ /* 1 solomon celeb 1 */ /* 2 solomon celeb 1 */ /* 3 solomon celeb 1 */ /* . . . . */ /* . . . . */ /* 4019 presap placebo 0 */ /* 4020 presap placebo 0 */ /* 4021 presap placebo 0 */ /* */ %macro expand(dataset,successes,trials); proc means data=&dataset. noprint; where &successes. ne . and &trials. ne .; var &successes.; output out=n n=n; run; data null; set n; call symput('num',n); run; %do j=1 %to &num.; data aaaa; set &dataset.(firstobs=&j. obs=&j.); zero=&trials.-&successes.; one=&trials.-zero; call symput('one',one); call symput('zero',zero); run; data aaaa&j.; set &dataset.(firstobs=&j. obs=&j.); drop &successes. &trials.; %do l=1 %to &one.; response=1; output; %end; %do l=1 %to &zero.; response=0; output; %end; run; %end; data &dataset._expanded; set %do j=1 %to &num.; aaaa&j. %end; ; rename response=y; run; proc datasets; delete aaaa:(gennum=all); run; quit; %mend;