BookmarkSubscribeRSS Feed

PROC MEANS의 CHARTYPE 옵션을 사용하여서 _TYPE_ 변수의 이진수 표현식 값을 획득

Started ‎06-12-2020 by
Modified ‎06-12-2020 by
Views 75

* 제목 : 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;

Version history
Last update:
‎06-12-2020 05:41 AM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

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.


Register now!

Article Labels
Article Tags