/* define macros */ %macro ren(in=, out=, suffix=); %local s; proc contents data=&in noprint out=__temp__(keep=name); run; data _null_; length s $ 32000; retain s; set __temp__ end=eof; s = trim(s)||' '||trim(name)||'='||compress(name||"&suffix"); if eof then call symput('s', trim(s)); run; proc datasets nolist; delete __temp__; run; quit; data &out; set &in(rename=(&s)); run; %mend; %macro reshape(input, output, suffix1=, suffix2=); proc sort data=&input; by var; run; data tmp&input; set &input; by var; _n + 1; if first.var then _n = 0; run; proc sort; by _n var; run; proc transpose data=tmp&input out=_by_value_(drop=_n _name_ _label_); var value; by _n; id var; run; %ren(in=_by_value_, out=_by_value_, suffix=&suffix1) proc transpose data=tmp&input out=_by_den_(drop=_n _name_ _label_); var density; by _n; id var; run; %ren(in=_by_den_, out=_by_den_, suffix=&suffix2) data &output; merge _by_value_ _by_den_; run; proc datasets library=work; ods exclude all; delete tmp&input _by_value_ _by_den_; run; ods exclude none; %mend;