🍄

5.2.2. 조건문/반복문

1. 실습을 위한 데이터 설정

실습을 위해 아래와 같이 데이터를 설정하고 진행하도록 하겠습니다.
data TESTLIB.subject_test1; /* data 라이브러리명.데이터셋 */ input name $9. class_ $ subject $ score ; /* 자릿수를 표기할 때에는 점까지 항상 표기 필요 한글은 $3자리까지 먹음 */ datalines; 이호준 1반 computer 92 이호중 1반 computer 80 이길동 2반 computer 90 이준호 2반 computer 86 ; run; /* 출력구문 */ proc print data=TESTLIB.subject_test1; run;
 
notion imagenotion image
 
해당 데이터를 가지고 SAS Studio에서 그래프도 한 번 그려 보겠습니다. 작업 및 유틸리티를 클릭하시면 GUI를 통해 코드 작업을 할 수 있습니다. 이렇게 생성된 코드는 코드란에 가시면 보실 수 있습니다.
 
notion imagenotion image

2. WHERE

SQL 구문의 where 구문과 같습니다. 조건에 맞는 데이터를 출력할 수 있습니다.
data TESTLIB.subject_test2; set TESTLIB.subject_test1; where score >= 90; run; /* 출력구문 */ proc print data=TESTLIB.subject_test2; run;
 
notion imagenotion image
 
조건을 지정해 줄 때 and/or 등을 이용해 조건을 작성할 수 있습니다.
 
data TESTLIB.subject_test2; set TESTLIB.subject_test1; where score >= 90 and class_='1반'; run; /* 출력구문 */ proc print data=TESTLIB.subject_test2; run;
 
notion imagenotion image
 
이번에는 or로 바꿔 보도록 하겠습니다. 위와 어떤 차이가 있는지 비교해보시기 바랍니다.
data TESTLIB.subject_test2; set TESTLIB.subject_test1; where score >= 90 or class_='1반'; run; /* 출력구문 */ proc print data=TESTLIB.subject_test2; run;
 
notion imagenotion image

3. LIKE문

조건문 안에서 해당 값을 포함하는 데이터를 추출할 수 있습니다. SQL에서 와일드카드와 같은 의미로 사용됩니다.
ex) where name like ‘%N’
→ 대문자 N으로 시작하는 데이터를 출력합니다.
data TESTLIB.subject_test2; set TESTLIB.subject_test1; where name Like'이호%'; run; /* 출력구문 */ proc print data=TESTLIB.subject_test2; run;
 
notion imagenotion image
 
_ (언더바)는 한 자리의 임의의 문자를 나타내고 % 는 빈 자리를 포함한 여러 임의의 자리를 나타냅니다. 위에 소스와 같이 홍%로 지정하면 name 컬럼 중 첫번째 글자가 홍으로 시작하는 값들을 출력해 줍니다. 만약 이호준을 언더바로 찾아내고 싶다면 _호_로 선택하거나 __준으로 선택해야 합니다.
 

4. CONTAINS

조건문 안에서 해당 값을 포함하는 데이터 추출하는 방법으로 contains를 사용합니다.
data mysas.contains; set mysas.subject_test1; where name contains "호"; run; proc print data=mysas.contains; run;
 
notion imagenotion image

5. IF문

참이되는 관측값만 선별하여 데이터셋을 만듭니다.

5.1 if조건문

조건이 참일때만 실행합니다.
data mysas.test5; set mysas.subject_test1; if class_='1반'; run; proc print data=mysas.test5; run;
 
notion imagenotion image
 

5.2 if else 조건문

조건식이 참이면 if의 명령문을 수행하고 거짓이면 else문의 명령문을 수행합니다.
if 조건식1 then 명령문 1; else 명령문2;
 
data mysas.test6; set mysas.subject_test1; if class_='1반' then teacher='홍길동'; else teacher='김길동'; run; proc print data=mysas.test6; run;
 
notion imagenotion image

5.3 if then 조건문

위에서 부터 조건식이 참인 경우이면 그에 맞는 명령문을 실행하고 거짓인 경우 다음 조건식으로 넘어가게 됩니다. 조건식에 모두 속하지 않을 경우 else 문장을 실행합니다.
if 조건식1 then 명령문 1; else if 조건식2 then 명령문2; else 식;
 

5.4 if then delete

관측치 가운데 불필요한 관측값을 제거합니다.
data 라이브러리.데이터셋; set 라이브러리.기존데이터셋; if 조건식 then delete; run;
 
data mysas.test7; set mysas.subject_test1; if class_='1반' then delete; run; proc print data=mysas.test7; run;
 
notion imagenotion image
 
위의 내용을 이용해서 조건이 충족될 때 새로운 값을 삽입할 수 있습니다.
 

5.5 IF THEN 새로운변수=값

조건이 참일 경우 새로운 변수를 생성하여 값을 넣습니다. if else문에서 teacher을 생성했던 것처럼 사용할 수 있습니다.
DATA 데이터셋; SET 기존데이터셋; IF 조건식 THEN 새로운변수=값; RUN;
 

5.6 IF THEN 새로운변수~; ELSE 새로운변수~;

조건이 맞는 경우 새로운 컬럼에 값을 추가합니다.
DATA 데이터셋; SET 기존데이터셋; IF 조건식 THEN 새로운변수=값1; ELSE IF조건식 THEN 새로운변수=값2'; ELSE 새로운변수=값3; RUN;
 
아래와 같이 조건문을 바꾸어 사용할 수 있습니다.
  • IF XXX=N; : 숫자 칼럼 XXX가 N인 행들만 선택합니다.
  • IF YYY='ZZ'; : 문자 칼럼 YYY가 ZZ인 행들만 선택합니다.
  • IF PPP^=N; : 숫자 칼럼 PPP가 N이 아닌 행들만 선택합니다(^=).
  • IF XXX=N AND YYY='ZZ'; : 칼럼 XXX가 N이고 칼럼 YYY가 ZZ인 행을 선택합니다(ANDOR).
  • IF XXX IN (N1,N2); : 칼럼 XXX가 N1이거나 N2인 행을 선택합니다(IN, NOT IN).
 

6. 반복 DO 명령어

반복해서 특정 구문을 실행시키고 싶다면 DO 명령어를 사용할 수 있습니다. 형식은 아래와 같습니다. 반복문 안에 output이 있는 것과 밖에 있는 것이 다르니 비교하여 익혀두세요.
 

6.1 반복문 안에 output이 있는 경우

data 데이터셋; DO I=초기값 TO 조건값 BY 증가값; 반복실행문장; OUTPUT;/*결과값을 행에 추가합니다.*/ END;/*DO명령어를 종료합니다.*/ run;
 
예제를 실행해보도록 하겠습니다.
1) 1부터 10까지 1씩 증가
data mysas.do1; DO i=1 TO 10 BY 1; 값=i; OUTPUT;/*결과값을 행에 추가합니다.*/ END;/*DO명령어를 종료합니다.*/ run; proc print data=mysas.do1; run;
 
notion imagenotion image
 
2) 1부터 10까지 1씩 증가하는데 값2에 2씩 곱하여 출력합니다.
data mysas.do1; do i=1 to 10 by 1; i=i; 값2=i*2; output; end; run; proc print data=mysas.do1; run;
notion imagenotion image
 
 

6.2 반복문 밖에 output이 있는 경우

data 데이터셋; DO I=초기값 TO 조건값 BY 증가값; 반복실행문장; END;/*DO명령어를 종료합니다.*/ OUTPUT;/*결과값을 행에 추가합니다.*/ run;
 
예제를 실행해보도록 하겠습니다. 위에 output이 안에 있는 경우와 비교해보세요.
data mysas.do2; DO i=1 TO 10 BY 1; i=i; END;/*DO명령어를 종료합니다.*/ OUTPUT;/*결과값을 행에 추가합니다.*/ run; proc print data=mysas.do2; run;
 
notion imagenotion image
 
DO명령어 바깥쪽에 OUTPUT이 있을 때는 모든 DO명령어가 시행되고서 마지막 시행된 DO명령어만 테이블에 결과값으로 출력됩니다. DO명령어는 i=10이 아니라 i=11인 상태로 종료된다는 뜻입니다.
summary 변수를 지정해 값의 증가되는 과정을 보도록 하겠습니다.
DATA mysas.do3; DO i=1 TO 10 BY 1; SUMMARY=i+10; OUTPUT; END; OUTPUT; /*종료된 마지막 값 출력*/ RUN; proc print data=mysas.do3; run;
notion imagenotion image
 
 
DO명령어는 조건값까지가 아니라 조건값 + 1 까지 실행합니다. 다만 조건값 + 1 이 실행되고 DO명령어는 종료되었기 때문에 SUMMARY에 합산하는 명령은 실행되지 않습니다. 따라서 실행결과 마지막에 보시면 SUMMARY는 상위 SUMMARY 값과 동일한 것을 볼 수 있습니다.
 
3) DO UNTIL ~할 때까지
증가할 값을 DO와 함께 주지 않고 아래와 같이 사용할 수도 있습니다.
DATA 데이터셋; DO UNTIL (변수>=값); 변수+1; OUTPUT; END; RUN
notion imagenotion image
간단한 예제를 실행해 보도록 하겠습니다.
DATA mysas.dountil1; DO UNTIL (i>=10); i+1; OUTPUT; END; RUN; proc print data=mysas.dountil1; run;
 
i는 until 명령어에 의해 만들어진 변수이기 때문에 UNTIL명령어에 의해 제한선까지만 DO명령어가 시행됩니다.
 
4) DO WHILE ~인 동안
DATA 데이터셋; DO WHILE (변수=<값); 변수+1; OUTPUT; END; RUN;
 
아래 예제를 실행해 보도록 하겠습니다.
DATA mysas.dowhile1; DO WHILE (i=<10); i+1; OUTPUT; END; RUN; proc print data=mysas.dowhile1; run;
notion imagenotion image
 
 
i가 조건값 보다 커질 경우 DO명령어를 이를 인식하고 더 이상 DO명령어를 진행하지 않습니다. 이에 따라 i=11임이 확인됐을 때 DO명령어가 종료됐음을 확인할 수 있습니다.
 

7. if문과 반복문의 조합

아래와 같이 if문과 조합을 할 수도 있습니다. if then do / else do end는 then 다음에 명령문이 2개 이상인 경우 사용합니다.
data 데이터셋; set 기존데이터셋; if 조건식 then do; 반복문장 end; else if 조건식 then do; 반복문장 end; run;
 
data mysas.ifdo; set mysas.subject_test1; if score>=90 then do; grade='A'; end; else if score>=80 then do; grade='B'; end; run; proc print data=mysas.ifdo; run;
 
 
notion imagenotion image
 
notion imagenotion image