Biostat/SAS Macro

SAS Macro 조건부 매크로 %IF - %THEN - %ELSE

카이집사
매크로에서의 조건부 매크로는 명령어 앞에 %를 붙이는 것 외 data step 에서 사용되는 IF-THEN-ELSE 와 동일하다. 

%IF expression %THEN result-text

%ELSE result-text;

 
[Example 1] index 매크로변수를 이용하여 "yes" 인 조건일 경우, %data 매크로를 실행시키고, local 매크로 변수인 var1과 var2 를 지정하여 %corr 이라는 매크로를 실행시켜 단순 %IF-%ELSE 조건부 매크로 %condi 를 정의
%MACRO condi(index, var1, var2);
%IF &index=yes %THEN %data
%corr
%MEND condi;

%codi(yes, bis, per)
%condi(no, bis, bcredit)

여기서, 조건절에 지정한 Yes, YES 는 서로 다르게 인식하게 된다. 이러한 경우에는 %UPCASE 함수 사용하여 입력되는 사항에 상관없이 대문자로 조건 성립여부를 판단하게끔 통일시키거나 %LOWCASE 함수를 이용하여 소문자로 통일시키는 것이 좋다. (참고. SAS Macro 매크로 함수 %UPCASE, %LOWCASE (tistory.com) )

만일, 위의 매크로에서 %CONDI(YES, bis, per) 을 실행시킨다면, 로그 창에 다음과 같이 매크로 로그 메시지가 나타나게 된다. 

SYMBOLGEN: Macro variable INDEX resolves to YES
MLOGIC(CONDI): %IF condition &index=yes is FALSE 

 

 

[Example 2] 두가지 조건에 대해 다른 data set 을 불러들여 %corr 매크로를 실행시키는 조건부 매크로

%MACRO data1;
DATA temp; SET bankdata; IF bis>8; RUN;
%MEND data1;

%MACRO data2:
DATA temp; SET bankdata; IF bis<8; RUN;
%MEND data2;

%MACRO corr;
PROC CORR;
  VAR &var1 &var2,
RUN;
%MEND corr;

%MACRO condi (index, varl, var2);
%IF &index=yes %THEN
  %DO;
  TITLE "Corr for BIS>8"
  %data1
  %corr
  %END;
%ELSE
  %DO;
  TITLE "Corr for BIS>8"
  %data2
  %corr
  %END
%MEND condi;

%condi(yes, bis, per)
%condi(no, bis, per)

두번째 %CONDI 매크로의 경우에는 yes와 no 조건 모두를 정의한 매크로로, 해당 조건에 대한 프로세스는 %DO-%END 문을 이용하여 그룹실행을 나타내었다.