* 제목 : PROC MEANS의 CHARTYPE 옵션을 사용하여서 _TYPE_ 변수의 이진수 표현식 값을 획득.;
* Sample 48287: Use the CHARTYPE option in PROC MEANS to get binary representation of the _TYPE_ variable;
* 출처 : http://support.sas.com/kb/48/287.html;
* 목적 : PROC MEANS(PROC SUMMARY)에서 CHARTYPE 옵션을 사용하여서 _TYPE_ 변수에 해당하는 문자 형식의 이진수 값을
* 획득할 수 있다.
* PROC MEANS는 기본적으로 CLASS 구문에 지정한 변수의 조합에 따라서 개별적으로 통계량을 계산하면서,
* 계산에 사용된 해당 변수 조합을 구분하여 표시하기 위하여 _TYPE_ 자동 변수를 생성한다. CHARTYPE 옵션은 변수의
* 조합 에 해당하는 변수 리스트를 이진수로 표시한다.;
* 이진수로 표현된 변수 리스트를 해당하는 CLASS 변수로 변경하기 위하여 이진수 값의 위치를 체크하여서 해당하는 변수
* 이름으로 변경하는 작업을 매크로를 통하여 수행한다.;
* 참고 : [이진수] 문자열 이진수를 사용한 조합 생성 / ALLCOMB 함수 사용(최홍규님) |
http://cafe.daum.net/statsas/3F8j/148
data test;
length a b c $ 8;
do a='yes','no';
do b='Moe','Larry','Curly';
do c='sas','quatch';
do i=1 to 4;
do j=1 to int(ranuni(i)*4) +1;
x=int(ranuni(j)*13) +1;
y=int(ranuni(x)*13) +1;
z=int(ranuni(y)*13) +1;
output;
end;
end;
end;
end;
end;
drop i j;
run;
%let classlist=a b c;
/*
* _TYPE_ 변수의 기본값 확인;
proc means data=test noprint;
class &classlist;
var x ;
output out=outsum1 sum= mean= / autoname;
run;
*/
* _TYPE_ 변수에 계산에 사용된 변수 목록을 이진수로 기록한다.;
proc means data=test chartype noprint;
class &classlist;
var x ;
output out=outsum sum= mean= / autoname;
run;
proc print data=outsum;
run;
%macro findtypes;
* classlist에 지정된 변수의 개수를 카운트한다.;
%let counter=%sysfunc(countw(&classlist,' '));
%put &counter;
data final;
retain &classlist _TYPE_ classvars;
set outsum;
length classvars classchk $ 25;
classvars = '';
classchk = symget('classlist');
PUT classchk=;
* _TYPE_ 변수의 개별 문자값을 체크하여서 참('1')인 경우 해당하는 변수 이름을 classvars 변수에 추가한다.;
%do i=1 %to &counter;
if substr(_type_,&i,1)='1'
then classvars=catx(' ',classvars,scan(classchk,&i,' '));
%end;
drop classchk;
run;
%mend;
%findtypes
proc print data=final;
run;
*******************************************************;
* 문장 간소화 작업 및 배열을 사용하여 처리 ;
*******************************************************;
* LENGTH 를 지정해줘야 함.;
%let counter=%sysfunc(countw(&classlist,' '));
%put &counter;
data BACK1;
set outsum;
length classvars $ 25;
classvars = '';
* _TYPE_ 변수의 개별 문자값을 체크하여서 참('1')인 경우 해당하는 변수 이름을 classvars 변수에 추가한다.;
do i=1 to &counter;
if substr(_type_,i,1)='1'
then classvars=catx(' ',classvars,scan("&classlist.",i,' '));
end;
run;
DATA BACK2;
SET OUTSUM;
RETAIN classvars;
length classvars $ 25;
ARRAY CLASSLIST &CLASSLIST.;
CLASSVARS = '';
DO I=1 TO &COUNTER;
IF substr(_type_,i,1)='1'
THEN CLASSVARS=CATX(' ',CLASSVARS,VNAME(CLASSLIST[FINDC(_TYPE_,'1',I)]));
END;
WHERE _TYPE_ NE '000';
RUN;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.