이번 게시글은 MERGE / SET / INFORMAT / FORMAT에 대해 알아보겠습니다.
-1) 1:1 병합
[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;
조인은 다음과 같이 LEFT Join , Right Join, Inner Join, Full Join이 있습니다.
-1) FULL Join
full join은 집합에서의 합집합입니다.
subject_test1_1 테이블과 phonehw를 병합하도록 하겠습니다.
[subject_test1_1]
[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;
결과는 다음과 같습니다.
-2) Inner Join
INNER JOIN은 집합에서의 교집합 입니다.
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변수가 두 테이블에서 중복되는 값들만 출력해 주는 것을 보여줍니다.
-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;
-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;
데이터의 수직적 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은 세로로 출력된다는 것을 알 수 있습니다.
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;
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.