데이터를 분석하다보면 두 개이상의 데이터 셋을 Key변수를 기준으로 결합해야하는 경우가 종종 있다.
오늘은 여러가지 병합 방법과 SAS를 사용해 병합을 수행하는 법을 살펴보겠다.
1. SORT 구문
데이터를 병합하기 전에는 병합의 기준이 될 Key 변수를 먼저 정렬해야한다.
SAS에서 정렬은 PROC SORT 명령어를 사용해 수행할 수 있다.
PROC SORT data=라이브러리명.데이터명 out = 새 데이터명;
/* 정렬한 데이터를 새로운 데이터로 만들고 싶을 때, out 옵션을 사용. */
BY key descending; /* 내림차순으로 정렬하고 싶을 때만 descending 추가 */
RUN;
SORT 구문을 사용하여 아래의 데이터 셋 A와 B를 각각 ID를 기준으로 정렬해보자.
proc sort data=MYSAS.A;
by ID;
run;
proc print data=MYSAS.A;
run;
|
proc sort data = MYSAS.B;
by ID;
run;
proc print data=MYSAS.B;
run;
|
![]() |
![]() |
2. MERGE 구문
데이터를 Key 변수로 정렬한 후에, 그 정렬된 key 변수를 사용하여 두 데이터 셋을 병합 할 수 있다.
MERGE 구문을 사용하면 다양한 형태의 데이터 병합을 수행할 수 있는데, 먼저 그 형태들을 살펴보자.
벤다이어그램으로 형태를 살펴보면 이해가 쉽다.
가장 많이 사용되는 병합의 종류는 크게 4개이다.
데이터 A에 있는 Key 변수를 기준으로 데이터 B를 병합하면 -> Left Join
데이터 B에 있는 Key 변수를 기준으로 데이터 A를 병합하면 -> Right Join
데이터 A와 B가 동시에 가지고있는 Key 값만을 사용하여 병합하면 -> Inner Join
데이터 A와 B에 있는 모든 Key 값을 사용하여 병합하면 -> Full Join
Inner Join을 제외한 다른 병합들은 옵션에 따라 교집합, 즉 A와 B에 중복되는 Key 변수를 제외한 병합 결과도 얻을 수 있다.
DATA 라이브러리명.데이터명;
MERGE SET_A(in=name1) SET_B(in=name2)
BY Key;
IF 병합 조건;
RUN;
구문 활용법을 살펴보면 데이터셋 뒤에 (in=name)이라는 옵션이 붙은 것을 알 수 있다.
이 옵션은 데이터 셋 별로 name이라는 이름을 갖는 임의의 변수를 만들라는 것이다.
이 임의의 변수는 KEY값이 해당 데이터 셋에 있는지(name=1) 없는지(name=0)를 나타내 준다.
여기서 한가지 주의할 점은, 임의로 생성될 변수들의 이름 name1과 name2는 각각 데이터 셋 A,B에 포함되어있는 변수명과 겹치면 안된다는 것이다.
아래의 데이터를 사용하여 간단히 (in=name) 옵션에 의해 생성되는 임의의 변수 예를 살펴보자.
MERGE MYSAS.A(in=a) MYSAS.B(in=b)
BY ID;
위와 같이 병합 코드를 사용한다고 생각해보자.
ID가 병합 기준 변수로 설정되었기 때문에, 임의의 변수 a와 b는 아래의 테이블에 나타난 것 처럼 임의의 변수 a와 b가 각각 생성되게 된다.
이 임의의 변수 a와 b를 사용하여 IF에 조건을 주게되면 다양한 형태의 병합을 진행 할 수 있게 된다.
예를 들어, Inner Join을 수행하고 싶다면 데이터 A와 B에 동시에 Key가 존재해야하기 때문에
IF a=1 and b=1 이라고 조건 주어야한다.
data innerjoin;
merge MYSAS.A(in=a) MYSAS.B(in=b);
by ID;
if a=1 and b=1;
run;
proc print data=innerjoin;
run;
|
Inner Join의 결과를 살펴보면, 데이터 A와 B에 동시에 존재하던 3개의 관측값들만 병합되어 출력된 것을 알 수 있다.
다른 병합 종류를 수행할 수 있는 IF 조건은 아래의 표로 간단히 살펴보겠다.
MERGE Type | IF statement |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
3. SET 구문
SET 구문은 병합하고자하는 2개의 데이터 A와 B의 형태가 동일할 경우, 두 데이터를 stack해서 쌓을 수 있는 병합 구문이다. 여기서 데이터 형태가 동일해야한다는 뜻은 같은 이름을 갖는 변수가 있을 경우엔 그 변수들의 타입이 동일해야한다는 것이다.
만약 데이터 A와 B가 둘다 Gender라는 변수를 가지고있는데,
A에는 Gender = {1,0}인 숫자형
B에는 Gender = {M,F}인 문자형으로 입력되어있다면, SET 구문을 사용했을 때 error가 출력된다.
또한 주의해야할 것은 A와 B에 동시에 존재하는 변수의 길이는 먼저 읽힌 데이터를 기준으로 설정된다.
SET A B; 라고 구문을 입력할 경우, 먼저 입력된 데이터 A를 먼저 읽게 되며 A의 변수 길이를 기준으로 B의 변수들이 읽히게 된다. 만약에 B에 포함된 변수의 길이가 더 길 경우엔 B 관측 값들이 잘릴 수 있으므로 주의해야한다!
DATA 라이브러리명.데이터명;
SET data_a data_b;
RUN;
data set1;
set MYSAS.A MYSAS.B;
run;
proc print data=set1;
run;
|
데이터 A와 B는 각각 겹치는 ID와 Name이 존재하지만, SET의 결과는 중복을 허용하면서 위아래로 stack에서 데이터를 병합 한 것을 확인 할 수 있다.
도움이 되었다면 하트를 눌러주세요 ❤(づ ̄ 3 ̄)づ
'Programming > SAS' 카테고리의 다른 글
[SAS 기초] Input/Put (0) | 2022.07.14 |
---|---|
[SAS 기초] Informat / Format (0) | 2022.05.26 |
[SAS 기초] 반복문 DO 사용법 (0) | 2022.05.18 |
[SAS 기초] 조건문(WHERE ~ IF ELSE) (0) | 2022.04.26 |
[SAS 기초] 데이터 생성과 처리 관련 구문 (0) | 2022.03.23 |
댓글