* 출처 : http://cafe.daum.net/statsas/3F8j/121
* 질문 올라온것을 생각해보다가 구현해보았습니다.
* 여러 형태가 있을듯 합니다. 한 STEP으로 처리해 보려했는데 쉽지않네요.;
* 배열을 이용하여서 결측치 포함된 변수를 선택후에 그 변수를 MACRO로 지정후에 DROP문에 사용하는 방법을 선택해보았습니다;
data BACK;
input VAR1 VAR2 VAR3 VAR4 $ VAR5 $ VAR6 $ VAR7 $ VAR8 VAR9;
datalines;
1 . 3 qwe . yui aaa 1 3
. . 2 . . hjk bbb 3 2
3 . 3 zxc . ttt ccc . 1
;
* 문자변수와 숫자변수 각각에 대하여 MACRO변수에 지정;
DATA _NULL_;
SET BACK END=FINAL;
* 문자변수;
ARRAY CTEMP(*) _CHARACTER_;
* MACRO변수로 지정;
CALL SYMPUT('CLIST',COMPRESS(DIM(CTEMP)));
* 숫자변수;\
ARRAY NTEMP(*) _NUMERIC_;
* MACRO변수로 지정;
CALL SYMPUT('NLIST',COMPRESS(DIM(NTEMP)));
RUN;
* 데이타세트가 포함하는 문자변수와 수자변수에 대하여 Macro변수 지정;
%put &clist;
%put &nlist;
DATA BACK1;
SET BACK END=FINAL;
ARRAY CTEMP(*) _CHARACTER_;
ARRAY NTEMP(*) _NUMERIC_;
* RETAIN변수를 배열로 지정;
ARRAY CSAN(&CLIST) CSAN1-CSAN&CLIST;
ARRAY NSAN(&NLIST) NSAN1-NSAN&NLIST;
RETAIN CSAN1--CSAN&CLIST NSAN1--NSAN&NLIST;
LENGTH LIST $ 50;
* 문자변수에 대한 처리;
DO I = 1 TO DIM(CTEMP);
* MISSING값을 RETAIN변수로 지정;
IF MISSING(OF CTEMP(I)) = 1 THEN CSAN(I) = MISSING(OF CTEMP(I));
* LIST변수에 MISSING값 존재하는 변수를 차례로 입력;
IF FINAL AND CSAN(I) = 1 THEN LIST=TRIM(LIST)||' '||TRIM(vname(CTEMP(i)));
END;
* 숫자변수에 대한 처리;
DO I = 1 TO DIM(NTEMP);
* MISSING값을 RETAIN변수로 지정;
IF MISSING(OF NTEMP(I)) = 1 THEN NSAN(I) = MISSING(OF NTEMP(I));
* LIST변수에 MISSING값 존재하는 변수를 차례로 입력;
IF FINAL AND NSAN(I) = 1 THEN LIST=TRIM(LIST)||' '||TRIM(vname(NTEMP(i)));
END;
CALL SYMPUT('MLIST',LIST);
*DROP CSAN: NSAN: LIST I;
RUN;
* Missing을 포함하는 변수 Macro지정;
%PUT &MLIST=;
DATA BACK2;
SET BACK(DROP=&mlist);
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.