본문 바로가기
SAS/SAS Tip's

[SAS TIP] 동일 관측치에서 변수간의 순위(RANK) 구하기

by 기서무나구물 2019. 1. 8.

포스팅 목차

    동일 관측치에서 변수간의 순위(RANK) 구하기

    * 기존에 올렸던 SAS TIP을 변형하여서 올립니다.;

     

    * 질문 : http://cafe.daum.net/statsas/B3m/14126;
    * 유사문제 : [Sort, Ranking] 관측치별로 변수 정렬하기(http://cafe.daum.net/statsas/3F8j/196);

     

    SAS Programming
    DATA BACK;
    INPUT TVAR1-TVAR5;
    CARDS;
    1 5 3 6 2
    1 5 3 1 2
    2 5 9 6 1
    1 2 . 3 8
    5 8 6 1 3
    1 5 2 6 6
    ;
    
    OPTIONS LS=150;

     

    * 효율적인 로직은 위 기본 참고 문서의 최홍규님의 방식을 참조하시기를 바랍니다.;
    * 현재 제 로직은 전체를 관측치를 모두 비교하여 비효율적.;
    * 변수와 관측치의 수자가 많으면, Proc Transpose의 속도와 비교 할 필요가 있을 듯 합니다.;

     

    SAS Programming
    DATA BACK1;
     SET BACK;
         ARRAY TVAR{*} TVAR1-TVAR5; * 관측치값 정렬;
         ARRAY POS(*)  POS1-POS5;   * 변수의 위치 정렬;
         *ARRAY NAM{*}  $ NAM1-NAM5; * 변수의 이름 정렬;
         ARRAY RANKING{*} RANK1-RANK5; * 변수의 순서 저장;
         
         * 기본적으로 현재 변수의 위치를 수치로 할당;
         DO k = 1 TO DIM(POS);
            POS{k} = k;
         END;
         DO i = 2 TO DIM(TVAR);
            DO J = i-1 TO 1 BY -1;
               * 현재 관측치가 다음 관측치보다 큰 경우 전환 작업 수행;
               IF TVAR{J}  > TVAR{J+1} THEN DO;
                  
                  TMP1      = TVAR{J+1}; * 관측치 전환;
                  TMP2      = POS(J+1);  * 변수의 위치 전환;
                  
                  TVAR{J+1} = TVAR{J};
                  POS(J+1)  = POS(J);
    
                  TVAR{J}   = TMP1;
                  POS(J)    = TMP2;
               END;
            END;
         END;
         
         * 전환된 변수의 위치값에 해당하는 변수명 추출;
         DO I=1 TO 5;
            CNT = POS(I);
            * 정렬 후 해당 위치 저장 정보를 사용하여서 RANKING 지정;
            RANKING(CNT) = I;
            * 변수의 이름을 추출;
            * CALL VNAME(TVAR(CNT),NAM(I)); * 참고 : CALL VNAME 함수;
         END;
    RUN;

     

    반응형

    댓글