본문 바로가기
Programming/SAS

[SAS 기초] 반복문 DO 사용법

by Kanii 2022. 5. 18.
반응형

오늘은 SAS의 반복문 DO 구문을 살펴보겠다.

 

R이나 Python에는 for, while, until, repeat 등등 다양한 반복문 명령어가 존재하지만,

SAS는 DO 어쩌구~만 입력하면 반복문을 수행해준다.

 

오늘은 다양한 DO 구문을 활용하여 구구단을 만들어보겠다!


1. DO i=start TO end BY by;

 

먼저 살펴볼 DO 구문의 첫 번째 용법은 시작점과 끝점 그리고 증가분을 지정하여 사용하는 방법이다.

R과 Python등에서 사용되는 For문이라고 생각하면 이해가 쉬울 것 같다.

DATA 데이터명;
DO i = 초기값 TO 마지막값 BY 증가량;
반복시행문;
OUTPUT; /* 반복시행 결과를 행으로 추가한다.*/
END; /* DO 구문을 종료하라는 명령어 - 반드시 DO 구문과 함께 사용되어야한다.*/
RUN;

 

이 용법을 사용하여 구구단 3단을 만들어보자

 

 data gugudan;
 DO i = 1 to 9 by 1;
 samdan = i*3;
 output;
 run;
 
 proc print data=gugudan;
 run;

기본으로 반복문에 사용된 변수 i 가 데이터에 같이 출력이 된다.

만약에 반복에 사용된 변수 i 를 출력하지 않고 싶다면, DATA step의 run; 전에 DROP i; 명령어를 사용해주면 된다.

 

DO 구문을 사용할 때, 항상 짝으로 붙혀줘야 하는 명령어들이 2개 있는데, END;OUTPUT;이다.

 

END;는 앞에서 반복하라고 명령한 DO를 끝내라!고 해주는 명령어이며,

OUTPUT;은 반복문의 결과를 데이터셋에 행으로 쌓으라는 명령어인데, 위치에 따라 출력되는 데이터 결과가 달라진다!

 

 >> OUTPUT 다음에 END  

  data
gugudan;
  DO i = 1 to 9 by 1;
  samdan = i*3;
  output;
  end;
  run;
 
  proc print data=gugudan;
  run;
  >> END 다음에 OUTPUT

 data gugudan;
 DO i = 1 to 9 by 1;
 samdan = i*3;
 end;
 output;
 run;
 
 proc print data=gugudan;
 run;
결과
결과

왼쪽의 경우는 위에서 살펴본 구구단이 그대로 출력된 것을 알 수 있다.

오른쪽의 경우는 OUTPUT 명령어가 END 다음에 사용되었을 때 결과를 출력하였는데, 반복문이 끝난 후의 마지막 값만을 출력해준다.

 

그런데 특이한 것은, i=10이 출력되고, 계산된 samdan 값은 3*9 = 27이 출력 된 것을 알 수 있다.

왜일까?!

 

DO i = 1 to 9 by 1; 이 구문은 우리의 반복 변수 i가 1부터 9까지 1만큼 늘려가면서 반복하라는 것인데,

즉, 각 단계마다 반복수행문장(samdan = i*3;)을 끝내고 나서 i를 1만큼 늘려간다.

 

그렇기 때문에, i=9였을 때

samdan = 9*3 = 27이 계산되고, i=9+1=10이 된 상태에서 반복문이 끝나게된다!


2. DO WHILE / DO UNTIL

 

1에서의 용법은 시작점과 끝점을 정해주었지만, DO WHILE / UNTIL은 조건문을 주어주고, 그 조건을 만족 혹은 만족하지 않을 때까지 반복하라는 명령어이다.

DATA 데이터명;
DO WHILE (조건문); /* 조건이 참일 때만 반복문을 수행 */
반복시행문장;
OUTPUT;
END;
RUN;
DATA 데이터명;
DO UNTIL (조건문); /* 조건이 참이 되면 반복문을 중단 */
반복시행문장;
OUTPUT;
END;
RUN;

 

두 구문을 사용하여 각각 구구단 4단과 5단을 만들어보자.

 

  data dowhile;
  n=0
  Do while (n<9);
  n+1
  Odan = n*5;
  output;
  end;
  run;
 
  proc print data=dowhile;
  run;
  data MYSAS.dountil;
  n = 0
  Do until (n>=9);
  n+1; 
  sadan = n*4;
  output;
  end;
  run;
 
  proc print data=MYSAS.dountil;
  run
결과
결과

3. IF문과 DO문의 결합

 

이전에 살펴본 IF문의 구조를 잠시 다시 살펴보자.

IF 조건문 THEN 수행문;

IF문의 기본적인 사용법은 조건문 부분에 AND나 OR등으로 여러개의 조건을 연결 할 수 있지만, THEN 뒤의 수행문은 하나 밖에 받을 수가 없었다.

 

만약에 조건에 따라 여러개의 수행문을 붙히고 싶을 경우, THEN DO;를 사용하여 여러개의 수행문을 이어준다.

IF 조건문 THEN DO;
    수행문1;
    수행문2;
    ……
END;

 

아래의 데이터를 사용하여 복합 구문을 실습해보자.

이 데이터에서 major가 Math 인 관측값을 뽑은 다음에, 해당 사람이 20대 이상이면 'over 20' 20대 미만이면 'under 20'으로 Age group을 만들어보자.

 

  /* IF + DO 조합 */
 
  data ifdo;
  set MYSAS.test;
  if major = "Math" then do;
       if age>=20 then Age_group="Over 20";
       else Age_group = "Under 20";
  end;
  run;
 
  proc print data=ifdo;
  run;

첫 번째 조건인 major = "Math" 이후에 다시 IF ELSE 구문을 넣으면서 2개의 수행문을 겹쳐넣었지만 THEN DO;와 함께 사용되며 데이터가 의도대로 잘 출력된 것을 확인 할 수 있었다.


오늘은 SAS의 반복문인 DO 구문을 살펴보았다.

DO 구문은 SAS의 중요한 기능 중 하나인 MACRO를 만들 때도 아주 많이 사용되기 때문에 숙력도를 많이 익혀두면 

더 효과적으로 SAS를 사용 할 수 있을 것이다!

반응형

댓글