반응형

[SAS] 변수 계산 (논리 연산) - DATA, SET, IF, ELSE IF, ELSE, AND, OR

 조건에 따라 변수를 바꾸고 싶을 때가 있다. 예를 들어, 인구를 1) 음주 & 흡연자, 2) 음주 & 과거 흡연자, 3) 그 외로 나누고 싶을 수 있다. 이런 경우에 사용하는 논리 연산에 대해 알아보고자 한다. 내용은 다음과 같다.

 

1) 조건문 (IF, ELSE IF)

2) AND

3) OR

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.10.06)

 

분석용 데이터 (update 22.10.06)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

몇 가지 예시를 통해 논리 연산에 대해 배워보고자 한다.

 

상황 : 전체 인구를 현재 흡연자와 그 외(과거 흡연자와 비흡연자)로 나누려고 할 때

 데이터의 흡연 변수는 다음과 같이 코딩되어 있음을 코드북에서 확인할 수 있다.

SMOK 0 1 2
내용 비흡연자 과거 흡연자 현재 흡연자

 

우리는 SMOK_S2라는 변수를 새로 만들어 다음과 같이 코딩되기를 바란다.

SMOK_S2 0 1
내용 과거 흡연자와 비흡연자 현재 흡연자

 

즉, SMOK를 SMOK_S2로 바꿀 때, 다음과 같이 바뀌어야 한다.

  SMOK SMOK_S2
비흡연자 0 0
과거 흡연자 1 0
현재 흡연자 2 1

 

SMOK의 0과 1은 SMOK_S2에서 0이어야 하고, SMOK의 2는 SMOK_S2에서 1이어야 한다. 이를 실행하는 방법은 여러 가지가 있는데, 코드를 하나씩 살펴보면 다음과 같다. 변수를 바꿀 때 쓰는 DATA-SET구문에 대한 설명은 다음 링크를 확인하길 바란다. 2022.10.06 - [통계 프로그램 사용 방법/SAS] - [SAS] 변수 계산 (산술 연산) - DATA, SET

 

1) 방법 1 (가장 기초적)

DATA hong.df_new;
SET hong.df;

*현재 흡연자 // 과거 흡연자 + 비흡연자로 나누기 (1);
IF SMOK=0 THEN SMOK_S2=0;
	ELSE IF SMOK=1 THEN SMOK_S2=0;
	ELSE IF SMOK=2 THEN SMOK_S2=1;

RUN;

IF구문은 다음과 같은 구조를 띤다.

IF {조건1} THEN {실행1}                  :"조건 1"을 만족하면 "실행1"을 실시한다.

    ELSE IF {조건2} THEN {실행2}    :"조건 1"을 만족하지 않는 데이터 중 "조건 2"를 만족하면 "실행 2"를 실시한다.

    ...

    ELSE {마지막 실행}                     :"조건1", "조건 2", ... 를 만족하지 않는 데이터는 "마지막 실행"을 실시한다.

 

이를 적용하면 다음과 같이 해석할 수 있다.

 

IF SMOK=0 THEN SMOK_S2=0; : SMOK가 0이면 SMOK_S2는 0이다.
     ELSE IF SMOK=1 THEN SMOK_S2=0; : SMOK가 0이 아닌 사람 중 SMOK가 1인 사람의 SMOK_S2는 0이다.
     ELSE IF SMOK=2 THEN SMOK_S2=1; : SMOK가 0, 1이 아닌 사람 중 SMOK가 1인 사람의 SMOK_S2는 0이다.

 

여기에는 ELSE구문이 없으므로, 모든 조건에 부합하지 못한 데이터가 만약 있다면 그 사람의 SMOK_S2는 결측치로 대체된다.

2) 방법 2 

*결측치가 없음을 확인하기;
PROC MEANS DATA=hong.df NMISS;
VAR SMOK;
RUN;

DATA hong.df_new;
SET hong.df;

*현재 흡연자 // 과거 흡연자 + 비흡연자로 나누기 (2);
IF SMOK=0 THEN SMOK_S2=0;
	ELSE IF SMOK=1 THEN SMOK_S2=0;
	ELSE SMOK_S2=1;

RUN;

이번에는 결측치가 없음을 확인하고 "ELSE IF"가 아닌 "ELSE"를 사용할 것이다. PROC MEANS를 이용하여 결측치가 없음을 우선 확인하자. 이에 관한 내용은 다음 링크에서 확인할 수 있다. 2022.09.23 - [기술 통계/SAS] - [SAS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등) - PROC UNIVARIATE, PROC MEANS

 

결측치가 없음을 확인했다면, 다음의 사고 과정은 매우 논리적이다.

 

1) 1000명 전원은 {비흡연자, 과거 흡연자, 현재 흡연자} 셋 중의 하나에 반드시 속한다.

2) 비흡연자에게 SMOK_S2는 0의 값을 부여하고, 과거 흡연자에게 SMOK_S2는 1의 값을 부여한다.

3) 아직 SMOK_S2값을 부여받지 못한 사람은 모두 현재 흡연자이므로 SMOK_S2는 1의 값을 부여한다.

 위의 3) 내용을 코드로 옮기면 "ELSE SMOK_S2=1"가 된다. 

 

만약 결측치가 있다면 흡연 정보를 모르는 사람 또한 SMOK_S2의 값은 1이 부여되어 현재 흡연자로 평가받기 때문에 결측치가 있을 때에는 이 코드를 사용하면 안 된다.

 

3) 방법 3

*결측치가 없음을 확인하기;
PROC MEANS DATA=hong.df NMISS;
VAR SMOK;
RUN;

DATA hong.df_new;
SET hong.df;

*현재 흡연자 // 과거 흡연자 + 비흡연자로 나누기 (3);
IF SMOK=0 OR SMOK=1 THEN SMOK_S2=0;
	ELSE SMOK_S2=1;

RUN;

OR 연산자를 사용하면 코드가 조금 더 간단해진다.

OR 연산자는 OR 앞뒤로 있는 조건 중 어떤 것이라도 만족하면 옳다고(TRUE)로 인식한다. 우리는 과거 흡연자, 비흡연자 모두 SMOK_S2에서는 0이라는 값을 부여할 것이므로 SMOK변수는 0이든 1이든 둘 중 하나이기만 하면 된다. 

IF SMOK=0 OR SMOK=1 THEN SMOK_S2=0;

그래서 SMOK=0, SMOK=1 중 하나라도 만족하면 SMOK_S2에는 0이라는 값을 부여한다는 위 코드를 사용하였다. 

 

4) 방법 4

다음 링크에서 비교 연산자에 대해 공부하고 온다면 다음과 같이 쓸 수 있음도 알 수 있다. 2022.10.06 - [통계 프로그램 사용 방법/SAS] - [SAS] 변수 계산 (비교 연산) - DATA, SET, GE, LE, NE, IN, MIN, MAX

*결측치가 없음을 확인하기;
PROC MEANS DATA=hong.df NMISS;
VAR SMOK;
RUN;

DATA hong.df_new;
SET hong.df;

*현재 흡연자 // 과거 흡연자 + 비흡연자로 나누기 (4);
IF SMOK<=1 THEN SMOK_S2=0;
	ELSE SMOK_S2=1;

RUN;

과거 흡연자와 비흡연자의 SMOK값은 각각 0,1이므로 "SMOK<=1"이라고 쓸 수도 있다.

만약 SMOK에 결측치가 있다면 비교 연산자중 일부는 결측치를 0으로 인식하므로, "SMOK<=1"을 만족한 것으로 본다. 따라서 결측치가 없음을 미리 확인해야 하며, 이에 관한 내용은 다음 링크에서 확인할 수 있다. 2022.10.06 - [통계 프로그램 사용 방법/SAS] - [SAS] 변수 계산 (비교 연산) - DATA, SET, GE, LE, NE, IN, MIN, MAX

 

5) 방법 5, 6

비교 연산자 중 IN을 사용하여 다음과 같이 작성할 수도 있다.

*결측치가 없음을 확인하기;
PROC MEANS DATA=hong.df NMISS;
VAR SMOK;
RUN;

DATA hong.df_new;
SET hong.df;

*현재 흡연자 // 과거 흡연자 + 비흡연자로 나누기 (5);
IF SMOK IN (0 1) THEN SMOK_S2=0;
	ELSE SMOK_S2=1;

RUN;

DATA hong.df_new;
SET hong.df;

*현재 흡연자 // 과거 흡연자 + 비흡연자로 나누기 (6);
IF SMOK IN (0:1) THEN SMOK_S2=0;
	ELSE SMOK_S2=1;

RUN;

방법 5의 IF SMOK IN (0 1) THEN SMOK_S2=0;

- SMOK가 0, 1인 데이터에게만 SMOK_S2의 값으로 0을 부여한다는 뜻이다.

방법 6의 IF SMOK IN (0:1) THEN SMOK_S2=0;

- SMOK가 0 이상 1 이하의 정수인 데이터에게만 SMOK_S2의 값으로 0을 부여한다는 뜻이다.

 

6) 방법 7

방법 6은 사실 "SMOK가 0 이상이면서 1 이하인 정수 데이터"에게 SMOK_S2의 값으로 0을 부여한 것이다. 이는 AND연산자를 사용한 것과 다름없다. AND 연산자는 AND 앞뒤로 있는 조건을 모두 만족해야 TRUE를 반환하는데, 이 경우 SMOK>=0 AND SMOK<=1 이라는 문구를 사용하면 되는 것이다.

*결측치가 없음을 확인하기;
PROC MEANS DATA=hong.df NMISS;
VAR SMOK;
RUN;

DATA hong.df_new;
SET hong.df;

*현재 흡연자 // 과거 흡연자 + 비흡연자로 나누기 (7);
IF SMOK>=0 AND SMOK<=1 THEN SMOK_S2=0;
	ELSE SMOK_S2=1;

RUN;

 

AND 연산자는 OR 연산자보다 우선하므로, 괄호를 적절히 치며 사용해야 한다. (사칙연산에서 곱셈이 덧셈보다 우선하는 것과 동일하다)

 

SAS 변수 계산 (논리 연산) 정복 완료!

작성일: 2022.10.06.

최종 수정일: 2022.11.03.

이용 프로그램: SAS v9.4

운영체제: Windows 10

 

반응형

+ Recent posts