1. 실습을 위한 데이터 설정2. WHERE 3. LIKE문4. CONTAINS5. IF문5.1 if조건문5.2 if else 조건문
5.3 if then 조건문5.4 if then delete5.5 IF THEN 새로운변수=값5.6 IF THEN 새로운변수~; ELSE 새로운변수~;6. 반복 DO 명령어6.1 반복문 안에 output이 있는 경우6.2 반복문 밖에 output이 있는 경우7. if문과 반복문의 조합
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;

해당 데이터를 가지고 SAS Studio에서 그래프도 한 번 그려 보겠습니다. 작업 및 유틸리티를 클릭하시면 GUI를 통해 코드 작업을 할 수 있습니다. 이렇게 생성된 코드는
코드
란에 가시면 보실 수 있습니다.
2. WHERE
SQL 구문의 where 구문과 같습니다. 조건에 맞는 데이터를 출력할 수 있습니다.
data TESTLIB.subject_test2; set TESTLIB.subject_test1; where score >= 90; run; /* 출력구문 */ proc print data=TESTLIB.subject_test2; run;

조건을 지정해 줄 때
and/or
등을 이용해 조건을 작성할 수 있습니다.data TESTLIB.subject_test2; set TESTLIB.subject_test1; where score >= 90 and class_='1반'; run; /* 출력구문 */ proc print data=TESTLIB.subject_test2; run;

이번에는
or
로 바꿔 보도록 하겠습니다. 위와 어떤 차이가 있는지 비교해보시기 바랍니다.data TESTLIB.subject_test2; set TESTLIB.subject_test1; where score >= 90 or class_='1반'; run; /* 출력구문 */ proc print data=TESTLIB.subject_test2; run;

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;

_ (언더바)
는 한 자리의 임의의 문자를 나타내고 %
는 빈 자리를 포함한 여러 임의의 자리를 나타냅니다. 위에 소스와 같이 홍%
로 지정하면 name 컬럼 중 첫번째 글자가 홍으로 시작하는 값들을 출력해 줍니다. 만약 이호준
을 언더바로 찾아내고 싶다면 _호_
로 선택하거나 __준
으로 선택해야 합니다.4. CONTAINS
조건문 안에서 해당 값을 포함하는 데이터 추출하는 방법으로 contains를 사용합니다.
data mysas.contains; set mysas.subject_test1; where name contains "호"; run; proc print data=mysas.contains; run;

5. IF문
참이되는 관측값만 선별하여 데이터셋을 만듭니다.
5.1 if조건문
조건이 참일때만 실행합니다.
data mysas.test5; set mysas.subject_test1; if class_='1반'; run; proc print data=mysas.test5; run;

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;

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;

위의 내용을 이용해서 조건이 충족될 때 새로운 값을 삽입할 수 있습니다.
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;

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;

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;

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;

DO명령어는 조건값까지가 아니라
조건값 + 1
까지 실행합니다. 다만 조건값 + 1
이 실행되고 DO명령어는 종료되었기 때문에 SUMMARY에 합산하는 명령은 실행되지 않습니다. 따라서 실행결과 마지막에 보시면 SUMMARY는 상위 SUMMARY 값과 동일한 것을 볼 수 있습니다.3) DO UNTIL ~할 때까지
증가할 값을 DO와 함께 주지 않고 아래와 같이 사용할 수도 있습니다.
DATA 데이터셋; DO UNTIL (변수>=값); 변수+1; OUTPUT; END; RUN

간단한 예제를 실행해 보도록 하겠습니다.
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;

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;

