[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)
시작하기 위해 라이브러리를 만들고, 파일을 불러온다.
라이브러리 만드는 방법: 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
'통계 프로그램 사용 방법 > SAS' 카테고리의 다른 글
[SAS] 변수 계산 (비교 연산) - DATA, SET, GE, LE, NE, IN, MIN, MAX (0) | 2022.10.06 |
---|---|
[SAS] 변수 계산 (산술 연산) - DATA, SET (1) | 2022.10.06 |
[SAS] SAS 데이터 (.sas7bdat) 불러오기 (0) | 2022.08.10 |
[SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT (0) | 2022.08.05 |
[SAS] 주석 처리 및 프로그램 특징 (0) | 2022.08.05 |