/* Creates k-1 0-1 dummy variables for each categorical variable. */ /* Example call: %dummy(dataset=one,var=x1 x2); */ /* where x1 and x2 are categorical variables. */ /* For this example, dummy returns dataset one_new with new */ /* variables x1_1, x1_2, ... , x1_k1-1 for k1 categories */ /* variables x2_1, x2_2, ... , x2_k2-1 for k2 categories */ %macro dummy(dataset, var); data a; set &dataset.; keep &var.; run; proc contents data=a noprint out=a; run; data _null; set a; call symput('p',_n_); run; %do k=1 %to %eval(&p.); data null; set a(firstobs=&k. obs=&k.); call symput('var',trim(left(name))); run; proc means data=&dataset. noprint; class &var.; output out=ab; run; proc sort data=ab nodupkey; by &var.; run; data ab; set ab; where _type_>0; call symput('levels',_n_-1); run; %do j=1 %to &levels.; data b; set ab (firstobs=&j. obs=&j.); call symput("level&j.",&var.); run; %end; %if &k.=1 %then %do; data &dataset._new; set &dataset.; %do j=1 %to &levels.; if &var.="&&level&j." then &var._&j.=1; else &var._&j.=0; %end; run; %end; %else %do; data &dataset._new; set &dataset._new; %do j=1 %to &levels.; if &var.="&&level&j." then &var._&j.=1; else &var._&j.=0; %end; run; %end; %end; %mend dummy;