번 게시글은 [SAS] 데이터 입력하기 Part3의 이어지는 글입니다.
MERGE문은 둘 이상의 데이터를 관측별로 병합하여 새로운 데이터를 만들 때 사용합니다.
합치는 데이터에 공통적인 변수가 있으면 이 공통변수를 BY문장에서 지정할 수 있습니다.
그리고 BY문을 사용하려면 SORT문을 먼저 호출하여 데이터값을 순서화해야 합니다.
MERGE SASdataset SASdataset .... ;
[SET]
데이터 A |
데이터 B |
SET문은 둘 이상의 데이터를 합치지만 변수기준으로 합치고 자료를 세로로 연결합니다.
[MERGE]
데이터 A | 데이터 B |
MERGE문은 둘 이상의 데이터 관측기준으로 합치고 가로로 합친다고 생각하면 됩니다.
또한, 둘 이상의 데이터를 병합하는데 두 가지 방법이 있습니다.
하나는 일대일 병합 ( one - to - one merge ) 이고, 다른 하나는 match merge입니다.
1) one - to - one merge
일대일 병합은 BY문이 뒤따르지 않고 MERGE문으로 수행되는 병합을 의미합니다.
2개의 데이터를 일대일로 변합하면 관측번호 순서대로 관측들이 병합됩니다.
2개의 데이터의 개수가 다르다면 관측 수가 많은 쪽 기준으로 병합됩니다.
그래서 관측수가 부족한 변수의 데이터 값은 전부 결측값으로 처리됩니다.
data owner;
input name $ @@;
datalines;
NaeKyung Minyoung Minji
;
run;
data car ;
input year make $ model $;
datalines;
1998 Daewoo Leganza
2000 Kia Sephia
1999 Hyundai Atoz
;
run;
data color; input color $ @@;
datalines;
Silver Purple White Red
;
run;
data driver;
merge owner car color;
run;
위의 코드를 보면 owner, car, color 데이터가 있습니다.
color데이터에는 다른 2개의 데이터와는 달리 모두 4개의 데이터가 있습니다. 마지막 코드를 보면 일대일 병합을 통해 driver 데이터를 만듭니다.
[ driver ]
위의 결과는 owner, car, color 데이터의 merge한 driver 데이터의 결과 입니다.
네 번째 관측에서 red에 대응되는 기타 변수들의 데이터 값이 전부 결측값으로 처리되었습니다.
merge 다음에 지정하는 자료 간에 겹치는 변수가 있으면 가장 나중에 지정된 자료의 데이터 값이 우선입니다. 따라서 겹치는 변수에 이미 입력된 데이터 값이 있더라도 전부 새로운 값으로 바뀌게 됩니다.
이러한 일대일 병합은 각 데이터에 수록된 관측순서가 정확히 일치할 때만 실용성이 있습니다.
하나의 개체어 대응과는 관측의 순서가 각 데이터마다 제각각일 때 일대일 병합을 하면 결과적으로 데이터가 엉망이 됩니다. 따라서 merge하려는 데이터의 관측순서가 개체별로 일치하는지 확인해야 합니다.
2) Match Merge
Match Merge는 한 개체에 관한 자료가 둘 이상의 데이터에 일정한 순서 없이 수록되어 있는 경우의 병합에 사용됩니다. Match Merge를 하려면 각 데이터에는 짝지을 기준이 되는 공통변수가 하나 이상이 있어야 합니다.
기준변수는 BY문에 지정하는데 BY문을 사용하려면 변수를 기준으로 자료의 순서화가 선행되어야 하며 순서화는 SORT를 이용해 수행됩니다.
data car ;
input year make $ model $;
datalines;
1998 Daewoo Leganza
2000 Kia Sephia
1999 Hyundai Atoz
;
run;
data color; input color $ @@;
datalines;
Silver Purple White Red
;
run;
위의 데이터에서 CAR, COLOR 데이터에는 공통변수 name이 있으며 CAR, COLOR데이터에는 name에 대응되는 데이터 값의 순서가 일치하지 않습니다.
/* 잘못된 match merge */
data driver;
merge car color;
by name;
run;
위의 코드는 잘못된 match merge입니다. SORT문 없이 BY문을 사용했기 때문입니다.
proc sort data = car;
by name;
run;
proc sort data = color;
by name;
run;
data driver;
merge car color;
by name;
run;
변수 name을 짝짓기의 기준변수로 삼아 name에 대하여 두 데이터의 자료를 순서화한 후 match merge를 시행한 결과입니다.
sort문을 사용해서 name문을 기준으로 두 데이터가 오름차순으로 순서화되었기 때문에 출력에서 관측의 배열순서는 이름의 영어 순입니다.
[ CAR ]
IF문의 뒤따르는 조건 수식의 결과에 따라 다음과 같이 사용형식입니다.
1) IF expression;
2) IF expression THEN statement;
3) IF expression THEN statement; ELSE statement;
여기서 expression은 sas의 수식이며, statement는 문장을 의미입니다.
사용형식의 1)은 부분집화화 IF(subsetting IF)라 하며 입력되는 관측 중 true인 값만 새로운 데이터를 만들 때 사용됩니다.
1) IF expression;
data class;
input name $ gender $ age @@;
datalines;
Sung M 33 Park M 28 Huh F 19
Moon F 29 Ahn M 34 Kim M 42
run;
data males;
set class;
if gender = 'M';
run;
class에서 gender가 'M'인 관측값만 걸러져 새로운 데이터 males 가 만들어집니다.
이렇게 되면 males는 class의 부분집합입니다.
2) IF expression THEN statement;
IF 다음의 수식이 참일 경우에 한하여 THEN 이후의 문장을 실행하고자 할 때 사용합니다.
아래의 코드는 위의 class 예시를 이용해서 gender의 데이터 값이 M이면 대신 Male을 넣는 코드입니다.
data new;
set class;
if gender = 'M' then gender = 'male';
run;
3) IF expression THEN statement; ELSE statement;
IF 수식이 참이면 THEN 이후의 문장을 실행하고 거진이면 ELSE문 이후의 문장을 실행합니다.
아래의 코드는 class 데이터에서 gender의 값이 M이면 Male로, 아니면 Female로 바꿉니다.
data class;
set class;
if gender = 'M' then gender = 'Male';
else gender = 'Female';
run;
[결과]
DELETE문은 현재 처리 중인 데이터에 관한 모든 문장의 실행의 중지시키고 현재 관측을 데이터에서 삭제합니다.
males 데이터에서 Sung과 Ahn에 대한 관측만 나오게 합니다.
data males;
input name $ gender $ age;
if gender = 'F' then delete;
datalines;
Sung M 33
Moon F 29
Ahn M 34
;
run;
[결과]
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.