오늘은 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를 사용 할 수 있을 것이다!
'Programming > SAS' 카테고리의 다른 글
[SAS 기초] Input/Put (0) | 2022.07.14 |
---|---|
[SAS 기초] Informat / Format (0) | 2022.05.26 |
[SAS 기초] 데이터 정렬 및 병합 구문 (SORT/MERGE/SET) (0) | 2022.05.19 |
[SAS 기초] 조건문(WHERE ~ IF ELSE) (0) | 2022.04.26 |
[SAS 기초] 데이터 생성과 처리 관련 구문 (0) | 2022.03.23 |
댓글