STUDY(공개)/SAS

6. 테이블 결합

모코코마을 2023. 9. 2.

1. 테이블 아래로 붙이기(SET)

확장편집기

DATA CLASS2;
INPUT NAME $ SEX $ AGE HEIGHT WEIGHT;
CARDS;
모코코 남 12 150 50
코니 여 11 130 40;
RUN;

 

VIEWTABLE

NAME SEX AGE HEIGHT WEIGHT
모코코 12 150 50
코니 11 130 40

확장편집기

DATA TEST;/*테이블 TEST를 생성합니다.*/
SET
SASHELP.CLASS
CLASS2;/*테이블 CLASS와 CLASS를 연속으로 불러옵니다.*/
RUN;/*SAS명령어를 종료합니다.*/

 

VIEWTABLE

Name Sex Age Height Weight
알프레드 14 69 112.5
앨리스 13 56.5 84
바바라 13 65.3 98
캐롤 14 62.8 102.5
헨리 14 63.5 102.5
제임스 12 57.3 83
제인 12 59.8 84.5
자넷 15 62.5 112.5
제프리 13 62.5 84
12 59 99.5
조이스 11 51.3 50.5
주디 14 64.3 90
루이스 12 56.3 77
메리 15 66.5 112
필립 16 72 150
로버트 12 64.8 128
로날드 15 67 133
토마스 11 57.5 85
윌리엄 15 66.5 112
모코코 12 150 50
코니 11 130 40

 

SET은 하나의 테이블만 불러오는 명령어가 아니라 불러올 테이블 모두를 지정하는 명령어

SASHELP.CLASS 테이블 아래에 처음에 만든 CLASS2를 붙인다는 뜻

 


1) 칼럼명이 일치하지 않는 경우

확장편집기

DATA CLASS2;
INPUT NAME $ AGE HEIGHT WEIGHT ADDR $;
CARDS;
모코코 12 150 50 남대문
코니 11 130 40 서초 ;
RUN;

 

VIEWTABLE

NAME AGE HEIGHT WEIGHT ADDR
모코코 12 150 50 남대문
코니 11 130 40 서초

확장편집기

DATA TEST;
SET SASHELP.CLASS CLASS2 ;
RUN;

 

VIEWTABLE

Name Sex Age Height Weight ADDR
알프레드 14 69 112.5 .
앨리스 13 56.5 84 .
바바라 13 65.3 98 .
캐롤 14 62.8 102.5 .
헨리 14 63.5 102.5 .
제임스 12 57.3 83 .
제인 12 59.8 84.5 .
자넷 15 62.5 112.5 .
제프리 13 62.5 84 .
12 59 99.5 .
조이스 11 51.3 50.5 .
주디 14 64.3 90 .
루이스 12 56.3 77 .
메리 15 66.5 112 .
필립 16 72 150 .
로버트 12 64.8 128 .
로날드 15 67 133 .
토마스 11 57.5 85 .
윌리엄 15 66.5 112 .
모코코 . 12 150 50 남대문
코니 . 11 130 40 서초

 

칼럼명이 동일한 부분은 그대로 이어 붙이고, 없는 부분은 결측값으로 표시

(위키독스 잘못되어있음)


2) 칼럼의 길이가 다른 경우

확장편집기

PROC CONTENTS DATA=SASHELP.CLASS;
RUN;

 

Results Viewer - SAS Output

# 변수 유형 길이 레이블
3 Age 숫자 8 나이
4 Height 숫자 8 (단위: 인치)
1 Name 문자 12 이름
2 Sex 문자 4 성별
5 Weight 숫자 8 몸무게(단위: 파운드)

 

칼럼별 속성 확인

2. PROC 사용 - 3. PROC CONTENTS(테이블 속성 보기) -> https://mokokovillage.tistory.com/69

 


확장편집기

DATA CLASS2;
INPUT NAME: $14. SEX $ AGE HEIGHT WEIGHT; /*NAME 변수 14자리로 길이 지정*/
CARDS;
오페르할아버지 1 17 207 90
칼리나리네리아 2 21 210 100;
RUN;

 

VIEWTABLE

NAME SEX AGE HEIGHT WEIGHT
오페르할아버지 1 17 207 90
칼리나리네리아 2 21 210 100

할아버지 청춘 그잡채


확장편집기

PROC CONTENTS DATA=CLASS2;
RUN;

 

Results Viewer - SAS Output

# 변수 유형 길이
3 Age 숫자 8
4 Height 숫자 8
1 Name 문자 14
2 Sex 문자 8
5 Weight 숫자 8

확장편집기

DATA TEST;
SET SASHELP.CLASS CLASS2 ;
RUN;

 

VIEWTABLE

Name Sex Age Height Weight
알프레드 14 69 112.5
앨리스 13 56.5 84
바바라 13 65.3 98
캐롤 14 62.8 102.5
헨리 14 63.5 102.5
제임스 12 57.3 83
제인 12 59.8 84.5
자넷 15 62.5 112.5
제프리 13 62.5 84
12 59 99.5
조이스 11 51.3 50.5
주디 14 64.3 90
루이스 12 56.3 77
메리 15 66.5 112
필립 16 72 150
로버트 12 64.8 128
로날드 15 67 133
토마스 11 57.5 85
윌리엄 15 66.5 112
오페르할아버 1 17 207 90
칼리나리네리 2 21 210 100

SET 뒤에 처음오는 데이터 테이블의 칼럼속성으로 추가되는 데이터가 맞춰짐

즉, 첫번째 데이터 테이블(SASHELP.CLASS)의 Name의 길이는 12이고 두번째 데이터 테이블(CLASS2)의 Name의 길이는 14이며, 두번째 데이터 테이블에 14자가 있음에도 불구하고 첫번째 데이터 테이블의 길이에 맞춰 데이터가 잘림

한글은 한글자가 2BYTE므로 마지막 글자가 짤린 것을 확인할 수 있음

 

 

해결책

ⅰ. 길이가 긴 테이블을 SET명령어에서 앞쪽으로 나오도록 한다.

칼럼의 길이가 긴 테이블B를 테이블A보다 앞에 나오도록 한다.

 

확장편집기

DATA TEST;
SET CLASS2 SASHELP.CLASS ;
RUN;

-> 이러면 CLASS 테이블의 NAME 컬럼 데이터 2개가 문제없이 아래에 붙음

 

 

ⅱ. 테이블을 생성할 때 테이블 A의 길이를 테이블 B에 맞춰서 변경한다.

하지만, SAS에서 제공하는 SASHELP는 수정이 불가능하므로 해당 예제에서는 사용 불가, 다른 테이블로 저장하거나, 외부 데이터을 기준점에 두고 붙일 때는 사용 가능

 

 

ⅲ. 이미 만들어진 테이블의 길이를 변경해준다.

 


3) 칼럼의 속성이 다른 경우

더보기

(해당 챕터는 위키독스에는 비공개처리되었는데 강의영상 존재)

https://youtu.be/5rcFwk0MmVI?feature=shared 

확장편집기

DATA CLASS2;
INPUT NAME: $14. SEX AGE HEIGHT WEIGHT; 
CARDS;
오페르할아버지 1 17 207 90
칼리나리네리아 2 21 210 100;
RUN;

PROC CONTENTS DATA=CLASS2;
RUN;

 

Results Viewer - SAS Output

# 변수 유형 길이
3 Age 숫자 8
4 Height 숫자 8
1 Name 문자 14
2 Sex 숫자 8
5 Weight 숫자 8

 

이전 테이블과 다르게 SEX변수를 숫자로 지정함(뒤에 $가 없음)

 

확장편집기

DATA TEST;
SET
SASHELP.CLASS
CLASS2
;
RUN;

 

로그

ERROR: 변수 Sex이(가) 모두 문자와 숫자로 정의되었습니다.

한 테이블은 SEX가 문자로, 한 테이블은 숫자로 지정되어 있어 오류 발생

 

해결책

ⅰ. 둘 중 한 변수의 이름을 바꾸기

한 칼럼의 이름을 SEX_1로 변경하기 -> 위아래로 붙지 않음

 

 

ⅱ. 테이블을 생성할 때 변수의 속성을 동일하게 만들기

위의 처럼 SEX $로 지정하여 문자로 데이터 받기

(이게 일반적인 방법)

 

 

ⅲ. 이미 만들어진 테이블의 속성을 변경하기


2. 테이블 옆으로 붙이기(MERGE)

확장편집기

DATA CLASS3;
INPUT LAST_NAME $ ADDR $ LINE;
CARDS;
루 서울 5
에버 부산 6;
RUN;

 

VIEWTABLE

LAST_NAME ADDR LINE
서울 5
에버 부산 6

확장편집기

DATA TEST;
MERGE
SASHELP.CLASS
CLASS3 ;
RUN;

 

VIEWTABLE

Name Sex Age Height Weight LAST_NAME ADDR LINE
알프레드 14 69 112.5 서울 5
앨리스 13 56.5 84 에버 부산 6
바바라 13 65.3 98 . . .
캐롤 14 62.8 102.5 . . .
헨리 14 63.5 102.5 . . .
제임스 12 57.3 83 . . .
제인 12 59.8 84.5 . . .
자넷 15 62.5 112.5 . . .
제프리 13 62.5 84 . . .
12 59 99.5 . . .
조이스 11 51.3 50.5 . . .
주디 14 64.3 90 . . .
루이스 12 56.3 77 . . .
메리 15 66.5 112   . .
필립 16 72 150 . . .
로버트 12 64.8 128 . . .
로날드 15 67 133 . . .
토마스 11 57.5 85 . . .
윌리엄 15 66.5 112 . . .

 

만약에 새로 추가되는 변수명이 아래와 같이 LAST_NAME이 아니라 NAME이라면

VIEWTABLE

NAME ADDR LINE
서울 5
에버 부산 6

 

해당 데이터를 SASHELP.CLASS와 MERGE를 시켰을 경우

VIEWTABLE

Name Sex Age Height Weight ADDR LINE
14 69 112.5 서울 5
에버 13 56.5 84 부산 6
아래는 같음

앞에 겹친 NAME값이 새로 입력되는 값으로 바뀜

 


1) 특정 값을 기준으로 결합하는 경우

더보기

(해당 챕터는 위키독스에는 비공개처리되었는데 강의영상 존재)

https://youtu.be/Io3Kz1uStF4?feature=shared 

확장편집기

DATA CLASS3;
INPUT NAME $ ADDR $ LINE;
CARDS;
존 서울 3
바바토스 뉴욕 4
;
RUN;

 

VIEWTABLE

NAME ADDR LINE
서울 3
바바토스 뉴욕 4

 

특정 값을 기준으로 결합하고 싶은 경우 정렬을 해줘야함.(PROC SORT)

2. PROC 사용 - 1. PROC SORT(순서대로 정렬하기) -> https://mokokovillage.tistory.com/69

 

 

확장편집기

PROC SORT DATA=SASHELP.CLASS OUT=CLASS; /*내부테이블이여서 변경이 안되므로 output으로 테이블 빼내기*/
BY NAME; /*정렬힐때도 BY*/
RUN;

PROC SORT DATA=CLASS4;
BY NAME; /*정렬힐때도 BY*/
RUN;

 

확장편집기

DATA TEST;
MERGE
CLASS
CLASS4
;
BY NAME; /*결합할때도 BY*/
RUN;

 

VIEWTABLE

Name Sex Age Height Weight ADDR LINE
알프레드 14 69 112.5 . .
앨리스 13 56.5 84 ..  
바바라 13 65.3 98 . .
바바토스         뉴욕 4
캐롤 14 62.8 102.5 . .
헨리 14 63.5 102.5 . .
제임스 12 57.3 83 . .
제인 12 59.8 84.5 . .
자넷 15 62.5 112.5 . .
제프리 13 62.5 84 . .
12 59 99.5 부산 3
조이스 11 51.3 50.5 . .
주디 14 64.3 90 . .
루이스 12 56.3 77 . .
메리 15 66.5 112 . .
필립 16 72 150 . .
로버트 12 64.8 128 . .
로날드 15 67 133 . .
토마스 11 57.5 85 . .
윌리엄 15 66.5 112 . .

BY명령어로  NAME을 기준으로 잡았기에 NAME은 중복 생성되지 않고 기존에 있던 칼럼을 그대로 사용

바바토스는 SASHELP.CLASS에 없는 값이기에 새로운 행이 하나 추가가 되면서 MERGE명령어에 의해 수평으로 결합됨. 

그리고 SEX AGE HEIGHT에는 데이터가 없는 공백발생

존은 기존 SASHELP.CLASS에 있기에 기존데이터에 MERGE명령어에 의해 수평으로 결합

 

 

만약에 정렬을 하지 않을 경우

로그

ERROR: BY 변수가 데이터셋 SASHELP.CLASS에서 제대로 정렬되지 않았습니다.

 

위와 같은 오류 발생

728x90

'STUDY(공개) > SAS' 카테고리의 다른 글

5. 데이터 전처리를 위한 SAS 명령  (0) 2023.09.02
4. 포맷(FORMAT)의 개념  (0) 2023.09.01
3. 데이터 생성법  (0) 2023.08.29
2. PROC 사용  (0) 2023.08.29
1. SAS의 기초  (0) 2023.08.29

댓글