* 기존에 올렸던 SAS TIP을 변형하여서 올립니다.;
* 질문 : http://cafe.daum.net/statsas/B3m/14126;
* 유사문제 : [Sort, Ranking] 관측치별로 변수 정렬하기(http://cafe.daum.net/statsas/3F8j/196);
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의 속도와 비교 할 필요가 있을 듯 합니다.;
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)); * 참고 : http://www.statwith.pe.kr/SAS/1.FUNCTION/F0077.htm;
END;
RUN;
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!