獨斷論

SAS 문법 - 6: IF ~ THEN ~ 활용하기 본문

과학과 기술/SAS

SAS 문법 - 6: IF ~ THEN ~ 활용하기

부르칸 2021. 9. 2. 06:36

1. 기본문법

IF (조건식) THEN (조건식이 참일때 수행);

ELSE (조건식이 거짓일때 수행);

 

예를들어 아래와 같이 AVG값이 65보다 크면 STATUS에 FAILED를 넣고 그렇지 않으면  STATUS에 PASSED를 넣도록 할수 있다.

data grades;
	input name $ 1-15 e1 e2 e3 e4 p1 f1;
	avg = mean(e1, e2, e3, e4);
	if avg < 65 then status = 'Failed';
	else status = 'Passed';

	datalines;
Alexander Smith  78 82 86 69  97 80
John Simon       88 72 86 50 100 85
Patricia Jones   98 92 92 99  99 93
Jack Benedict    54 63 71 49  82 69
Rene Porter     100 62 88 74  98 92
;
run;

proc print data = grades;
	var name e1 e2 e3 e4 avg status;
run;

 

2. 비교 연산자

비교 SAS 문법
다른 문법
작다 < LT
크다 > GT
작거나 같다 <= LE
크거나 같다 >= GE
같다 = EQ
같지 않다 ^= NE
in 연산자 뒤에오는 것들중에 있으면 in IN

위에 if~then~else에 사용할수 있는 연산자들을 적었다. A < B 또는 A LT B라고 쓰면 A가 B보다 작을때 true가 되고 클때 false가 된다. in이라는 연산자는 아래 예제를 보자.

data grades;
	input name $ 1-15 e1 e2 e3 e4 p1 f1;
	if p1 in (98, 99, 100) then project = 'Excellent';
	datalines;
Alexander Smith  78 82 86 69  97 80
John Simon       88 72 86 50 100 85
Patricia Jones   98 92 92 99  99 93
Jack Benedict    54 63 71 49  82 69
Rene Porter     100 62 88 74  98 92
;
run;

proc print data=grades;
	var name p1 project;
run;

if p1 in (98, 99, 100) then project = 'Excellent'는 p1의 값이 98, 99, 100중에 하나라도 같은 값이 존재하면 project에 Excellent를 넣으라는 뜻이 된다. p1이 98.1이라면 if~ 조건부는 거짓이 된다.

 

3. 논리 연산자

논리 SAS 문법 다른 문법
are both conditions true? & AND
is either condition true? | OR
reverse the logic of a comparison ^ or ~ NOT

간단한 예로써

IF (p1 GT 90) AND (f1 GT 90) THEN performance = 'excellent';

라고 하면 p1이 90보다 크고 f1이 90보다 크다면 performance에 excellent를 대입하라는 뜻이 된다.

OR로 바꾼다면

IF (p1 GT 90) OR (f1 GT 90) THEN performance = 'very good';

라고 하면 p1이 90보다 크거나 f1이 90보다 크다면 performance에 excellent를 대입하라는 뜻이 된다.

 

위 연산자를 이용하여 학생의 성적에 따라 A~F를 넣어보자.

data grades;
	input name $ 1-15 e1 e2 e3 e4 p1 f1;
	avg = (e1 + e2 + e3 + e4) / 4;
	if (avg EQ .) then overall = 'incomplete';
	else if (avg >= 90) then overall = 'A';
	else if (avg >= 80) and (avg < 90) then overall = 'B';
	else if (avg >= 70) and (avg < 80) then overall = 'C';
	else if (avg >= 60) and (avg < 70) then overall = 'D';
	else if (avg < 60) then overall = 'F';
	datalines;
Alexander Smith  78 82 86 69  97 80
John Simon       88 72 86  . 100 85
Patricia Jones   98 92 92 99  99 93
Jack Benedict    54 63 71 49  82 69
Rene Porter     100 62 88 74  98 92
;
run;

proc print data=grades;
	var name avg overall;
run;

overall이라는 변수에 avg의 범위에 따라서 A, B, C, D, F를 할당하였다. 결측값을 해결하기 위하여 mean함수를 사용하지 않고 직접 평균을 구하였고 결측값인 경우 overall에 incomplete를 할당하도록 하였다.

 

4. 여러문장을 실행하는 if~then~else

지금까지는 if  조건이 참일때 하나의 문장만 실행하였다. if 조건이 참일때 여러가지 문장을 실행하려면 then 뒤에 do ~ do를 추가하여야만 한다. 예를들어 e4에 결측값이 있을때 그 값에 0을 넣고 status에 fail을 넣으려면 아래와 같이 한다.

data grades;
	input name $ 1-15 e1 e2 e3 e4 p1 f1;
	if (e4 EQ .) then do;
		e4 = 0;
		status = 'failed';
	end; 
	datalines;
Alexander Smith  78 82 86 69  97 80
John Simon       88 72 86  . 100 85
Patricia Jones   98 92 92 99  99 93
Jack Benedict    54 63 71 49  82 69
Rene Porter     100 62 88 74  98 92
;
run;

proc print data=grades;
	var name e1 e2 e3 e4 p1 f1 status;
run;

 

Comments