Bogdan Taranta

Bogdan Taranta Business Solutions
Manager

Temat: [SAS] transpozycja w jeszcze inny sposób...

Znowu czas na sprytne makro do transpozycji, tym razem z kolumn do wierszy. Kilka postów wcześniej pokazywałem coś podobnego w ORACLE, w SAS jest to jednak o wiele prostsze i nie wymaga dotykania XML'a. Smaczek polega na zastosowaniu tylko DATA STEP, co powinno przyśpieszyć wykonanie. Zatem, ze zbioru w postaci:


ID ZM_1 ZM_2
1 100 A
2 300 B
3 300 C

...otrzymamy zbiór o takiej strukturze:


ID _NAME_ _CVALUE_ _NVALUE_
1 ZM_1 100
1 ZM_2 A .
2 ZM_1 . 300
2 ZM_2 B .
3 ZM_1 . 300
3 ZM_2 C .

Czyli każda zmienna wpada do nowego wiersza, a jej wartości do kolumny. Ale inaczej niż w PROC TRANSPOSE, wartości tekstowe wpadają do kolumny _CVALUE_, a numeryczne do _NVALUE_. Wszystko odbywa się w grupach wyznaczanych przez zmienną ID.


%MACRO TRANS(DATASET, BY);
data &DATASET;
length ID 8;
length _NAME_ $32.;
length _CVALUE_ $512.;
length _NVALUE_ 8;
keep ID _NAME_ _CVALUE_ _NVALUE_;
SID = open("&DATASET","is");
ID_INDEX = .;
do i = 1 to attrn(SID,"nvars");
if upcase(varname(SID,i)) = upcase(compress("&BY")) then ID_INDEX = i; end;
do while(fetch(SID)=0);
ID = getvarn(SID,ID_INDEX);
do i = 1 to attrn(SID,"nvars");
if i ^= ID_INDEX then do;
_NAME_ = varname(SID,i);
if vartype(SID,i) = 'C' then do;
_CVALUE_ = getvarc(SID,i);
end;
else _NVALUE_ = getvarn(SID,i);
output;
_CVALUE_ = .;
_NVALUE_ = .;
end;
end;
end;
run;
%MEND;
Bogdan Taranta edytował(a) ten post dnia 22.07.11 o godzinie 16:13