BookmarkSubscribeRSS Feed

[ SAS 활용 노하우] MERGE / SET / INFORMAT / FORMAT

Started ‎06-20-2021 by
Modified ‎06-20-2021 by
Views 5,252

 

이번 게시글은 MERGE / SET / INFORMAT / FORMAT에 대해 알아보겠습니다.

 

 

 

 

1. MERGE

 

-1) 1:1 병합

 

1.png       2.png

                         [subject_test1_1]                                [subject_test2]

 

다음과 같이 2개의 테이블이 존재합니다. 공통으로 가지고 있는 변수는 id변수입니다.

 

data work.subject_test1_1;
input id name $9. class_ $ subject $ score;
datalines;
101 이호준 1반 computer 92
102 이호중 1반 computer 80
201 이길동 2반 computer 90
202 이준호 2반 computer 86
;
run;

proc print data = work.subject_test1_1;
run;


data work.subject_test2;
input id phonenumber $16.;
datalines;
101 010-1234-5678
102 010-9876-5432
201 010-4567-1565
202 010-7536-9512
;
run;

proc print data = work.subject_test2;
run;

data work.join;
merge work.subject_test1_1 work.subject_test2;
by id;
run;
proc print data = work.join;
run;

 

merge를 하기 위해서는 다음과 같은 코드가 필요합니다.

 

proc sort data = 라이브러리명.데이터셋명;
by 정렬할 변수;
run;

 

 
 

2. 조인의 종류

 

3.png

 

조인은 다음과 같이 LEFT Join , Right Join, Inner Join, Full Join이 있습니다.

 

-1) FULL Join

 

full join은 집합에서의 합집합입니다.

 

subject_test1_1 테이블과 phonehw를 병합하도록 하겠습니다.

 

4.png

                              [subject_test1_1]

 

5.png

                                   [phonehw]

 

/*subject_test2 */
data work.phonehw;
input id phonenumber $16.;
datalines;
101 010-1234-5678
102 010-9876-5432
201 010-4567-1565
202 010-7536-9512
;
run;

proc print data=work.phonehw;
run;

병합하기 전 꼭 정렬을 해주셔야 합니다.

 

/*정렬*/
proc sort data = work.phonehw; by id; run; proc sort data = work.subject_test1_1; by id; run;

 

/*merge 실행 */
data work.fulljoin;
merge work.subject_test1_1 work.phonehw;
by id;
run;

proc print data = work.fulljoin;
run;

결과는 다음과 같습니다.

 

5.png

 

 

-2) Inner Join

 

INNER JOIN은 집합에서의 교집합 입니다.

 

6.png

 

2개의 테이블이 있을 경우 병합하기 전에 정렬을 해야 합니다.

 

/*phonehw2*/
data work.phonehw2;
input id name $ 10. type $ number $16.;
datalines;
101 이호준 company 004-050-1200
101 이효준 phone 010-1234-5678
102 이효중 home 012-134-7894
201 이길동 phone 010-4567-1565
202 이준호 phone 010-7536-9512
201 이준길 phone 010-1563-4595
;
run;

proc print data = work.phonehw2;
run;
/*정렬*/
data work.innerjoin;
merge work.phonehw2(in = emps) work.subject_test1_1(in=cell);
by id;
if enps=1 and cell=1;
run;

proc print data = work.innerjoin;
run;

결과는 아래의 테이블입니다.

결과를 보면 name변수가 두 테이블에서 중복되는 값들만 출력해 주는 것을 보여줍니다.

 

7.png

 

-3) Right Join

 

오른쪽 테이블 기준으로 합쳐집니다.

 

/*right join*/
data work.rightjoin;
merge work.subject_test1_1(in = emps) work.phonehw2(in=cell);
by id;
if emps = 0 and cell = 1;
run;

 

스크린샷_2021-06-20_오후_9.14.29.png

 

 

-4) left join

 

왼쪽 테이블 기준으로 합쳐집니다.

 

/*left join*/
data work.data11;
merge work.data3(in=emps) work.data9(in = cell);
by name;
if emsps = 1 or cell=0;
run;

 

 

 

3. SET

 

데이터의 수직적 1대1 결합(데이터 구조가 동일할 때) 하는 방법입니다.

 

data 라이브러리.통합데이터;
set 라이브러리.데이터셋1 라이브러리.데이터셋2;
run;
/*set*/
data work.set1;
set work.subject_test1_1 work.phonehw2;
run;

proc print data = work.set1;
run;

다음의 결과를 보면 set은 세로로 출력된다는 것을 알 수 있습니다.

 

8.png

 

 

 

4. Informat / format

 

 

Format은 숫자, 문자, 날짜 등 변수의 데이터 유형을 변경할 때 사용합니다.

 

- Informat : 데이터를 불러올 때 데이터 유형을 변경합니다. Informat 구문은 data 쓰기 단계에서 format을 지정할 때 사용합니다.

- Format : 데이터를 불러온 후 데이터 유형을 변경합니다. format 구문은 proc print 문에서 사용합니다.

 

두 명령어는 같은 기능을 하지만 어느 위치에 쓰이는지에 따라 informat / format이 나누어 지게 합니다.

하지만 informat을 많이 사용하지 않습니다. 이유는 informat대신 format을 이용해도 포맷을 사용할 수 있습니다.

 

format은 숫자 / 문자 / 날짜 포맷으로 나누어집니다.

 

-1 ) 숫자 포맷

 

> 숫자. : 자릿수 만큼 값을 표시합니다.

> 숫자.숫자 : 앞자리 숫자 만큼 전체 길이를 표현하고 뒷자리 숫자 만큼 소수로 표현합니다.

> BEST숫자. : 소수점(.)을 표현하며 숫자 자리 수 만큼 수를 표현합니다.

> COMMA숫자.숫자 : 3자리 숫자마다 콤마(,)를 표시합니다.

> PERCENT숫자.숫자 : 주어진 숫자를 %로 표현합니다.

 

-2) 문자 포맷

 

문자 포맷은 처음 데이터를 생성하였을 때와 같이 $숫자. 으로 사용됩니다.

 

/*informat*/
data work.df1;
informat name $12.;
input name;
datalines;
홍길동;
run;


/*format*/
data work.df2;
format name $12.;
input name;
datalines;
홍길동;
run;

 

 

-3) 날짜 포맷

 

날짜 변수는 1960년 1월 1일을 숫자 0으로 표시합니다. 이 숫자를 날짜 포맷으로 변경하는 것 입니다.

여기서 YY는 연도, MM은 월, DD는 일을 나타내며 YYMMDD숫자. or MMDDYY숫자. 등 여러가지 방법으로 사용하실 수 있습니다.

HOUR는 시를 나타냅니다.

날짜 변수는 여러가지 포맷방법이 있기 때문에 자주 사용하는 포맷에 대해 알아보겠습니다.

 

> DATE숫자. : 일월년. [결과] 1JAN1960

> YYMMDD숫자. : 연도-월-일 [결과] 1960-01-01

> WEEKDATE. : 요일, 월일, 연도 [결과] Friday, January 1, 1960

> WORDDATE. : 월, 일 연도 [결과] January 1,1960

> NLDATE숫자. : 1960년 01월 01일

> YYMMN숫자. : 연도월 [결과] 19600101

> MONY숫자. : 월연도 [결과] JAN1960

> YEAR숫자. : 연도 [결과] 1960

> DATETIME숫자.숫자 : 일월년: 시:분:초 [결과] 01JAN1960:00:00:00

> TIME숫자.숫자 : 시:분:초 [결과] 0:00:00

> HHMM숫자.숫자 : 시:분 [결과] 0:00

> HOUR숫자.숫자 : 시각 [결과]0

 

날짜 변수는 처음에 값을 입력할 때는 숫자로 인식합니다. format 을 이용해 새로운 테이블을 생헝하거나 proc print 에서 적용시켜 날짜 형식을 표기할 수 있습니다. 대표적인 날짜 포맷 형식인 DATE숫자. 사용해 알아보도록 하겠습니다.

 

날짜 informat에서는 format을 사용하지 못합니다.

data work.df3;
informat date DATE8.;
input date;
datalines;
14JAN20
;
run;
Version history
Last update:
‎06-20-2021 09:13 AM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

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.


Register now!

Article Labels
Article Tags