본문 바로가기
Programming/SAS

[SAS 기초] 데이터 정렬 및 병합 구문 (SORT/MERGE/SET)

by Kanii 2022. 5. 19.
반응형

데이터를 분석하다보면 두 개이상의 데이터 셋을 Key변수를 기준으로 결합해야하는 경우가 종종 있다.

오늘은 여러가지 병합 방법과 SAS를 사용해 병합을 수행하는 법을 살펴보겠다.


1. SORT 구문

 

데이터를 병합하기 전에는 병합의 기준이 될 Key 변수를 먼저 정렬해야한다.

SAS에서 정렬은 PROC SORT 명령어를 사용해 수행할 수 있다.

PROC SORT data=라이브러리명.데이터명  out = 새 데이터명;
/* 정렬한 데이터를 새로운 데이터로 만들고 싶을 때, out 옵션을 사용. */
BY key descending; /* 내림차순으로 정렬하고 싶을 때만 descending 추가 */
RUN;

SORT 구문을 사용하여 아래의 데이터 셋 A와 B를 각각 ID를 기준으로 정렬해보자.

(좌) 데이터 셋 A  (우) 데이터 셋  B

  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) 옵션에 의해 생성되는 임의의 변수 예를 살펴보자.

(좌) 데이터 셋 A  (우) 데이터 셋  B

MERGE MYSAS.A(in=a) MYSAS.B(in=b)
BY ID;

위와 같이 병합 코드를 사용한다고 생각해보자.

ID가 병합 기준 변수로 설정되었기 때문에, 임의의 변수 a와 b는 아래의 테이블에 나타난 것 처럼 임의의 변수 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

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;

SET 구문 결과

데이터 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

댓글