안녕하세요. MYSAS입니다.
금주는 외부 파일을 읽어드리는 법에 대해서 알아보겠습니다
목 차
사용하시고자 하는 자료가 이미 SAS 데이터 셋에 있다면 이 장을 보시지 않으셔도 좋습니다.
SAS에서는 text file로 부터 파일을 읽어드리는 여러가지 방법이 있는데요 이는 데이터들이 어떻게 배열되어 있냐에 따라 달라집니다. 여러분은 그중에서 가장 편한 방법을 사용하기만 하시면 되죠. 다음 두가지 방법을 살펴 보도록 하겠습니다
저번 시간에 이어 같은 파일을 읽어낸다고 가정해봅시다
File: C:\books\learning\mydata.txt
M 50 68 155
F 23 60 101
M 65 72 220
F 35 63 133
M 15 71 166
값들이 Blank로 나눠진 텍스트 파일입니다. 이를 읽어내는 방법은 저번시간에도 그렇듯이
Data demographic;
Infile 'c:\books\learning\mydata.txt';
Input Gender $ Age Height Weight;
run;
코딩을 쓰면 파일을 잘 읽어낼 수 있을 것입니다.
이번엔 파일의 모습을 살짝 바꾸어 보겠습니다
M 50 68 155
F 60 101
M 65 72 220
F 35 63 133
M 15 71 166
두번째 줄 Age 변수의 값이 없어진 것이지요. 위에 같은 코딩을 쓴다면 어떤 결과가 나올까요?
세번째 줄의 M을 두번째 줄의 Weight변수의 값으로 인식을 해버릴 것입니다. 이럴 때는 텍스트 파일을 살짝만 변형시켜주면 되는데요
바로 결측값에 점을 찍어 구체화 시켜주는 방법입니다
M 50 68 155
F . 60 101
M 65 72 220
F 35 63 133
M 15 71 166
단, 여기서 주의할 점은 SAS는 결측값을 0으로 인식하지 않는다는 것입니다. 만약 전체 Age의 평균을 구한다 하면 결측값은 생략하고
오로지 비-결측값의 평균을 낼 것입니다.
4, Comma로 나눠진 데이터 값 읽어내기
CSV파일이라고도 하죠. Comma Separated File, 문자 그대로 Comma로 나눠진 파일입니다. 그 모습은 이렇습니다
File: C:\books\learning\mydata.csv
"M", 50, 68, 155
"F", 23, 60, 101
"M", 65, 72, 220
"F", 35, 63,133
"M", 15, 71,166
보시는 것처럼 값들이 쉼표, comma로 나눠져 있습니다. 이러한 파일을 읽고 싶을땐 다음과 같은 코딩을 써야 합니다 .
Data demographic;
Infile 'c:\books\learning\mydata.csv' dsd;
Input Gender $ Age Height Weight;
run;
여기서 DSD에 대한 간략한 설명 들어갑니다
간혹 이런 파일이 있을 수 있지요
M: 50: 68: 155
F: 23: 60: 101
M: 65: 72: 220
F: 35: 63: 133
M: 15: 71: 166
이때 쓰는 옵션이 바로 DLM입니다
Infile 'c:\books\learning\mydata.csv' dlm=':';
혹은 dlm의 원래 이름인 delimiter을 써도 되구요. 또한 앞에서 살펴보신 DSD와 같이 써도 됩니다
Infile 'c:\books\learning\mydata.csv' dsd dlm=':' ;
이때의 특징은 앞에 기술해놓은 DSD의 기능을 충실히 발휘하지만 delimiter의 디폴트 값을 컴마가 아닌 따옴표 안에 있는 기호,
즉 위 코딩에서는 콜론으로 바꾸게 되는 것이죠.
외부에서 읽어드리지 않고 이번엔 그냥 직접 입력해서 Data set을 만드는 작업을 해보겠습니다.
data demographic;
input Gender $ Age Height Weight;
datalines;
M 50 68 155
F 23 60 101
M 65 72 220
F 35 63 133
M 15 71 166
;
보시다시피 INFILE문이 DATALINES 문으로 대체가 되었습니다. 여기서도 마찬가지로 DSD 혹은 DLM 옵션을 사용할 수 있는데요
data demographic;
infile datalines dsd;
input Gender $ Age Height Weight;
datalines;
"M", 50, 68, 155
"F", 23, 60, 101
"M", 65, 72, 220
"F", 35, 63,133
"M", 15, 71,166
;
어째튼 dsd든 dlm이든 infile문의 옵션이기 때문에 data step에 항상 명기를 해야해주고 datalines옵션도 같이 써주고 싶다면
infile문과 함께 사용해주어야 합니다.
7.고정된 열에 저장된 데이터를 읽어들이기 : 1. Column Input 방법
c:\books\learning\bank.txt 파일이 있다합시다. 여기 저장된 데이터는 이런 내용을 포함하고 있습니다
변수 |
설명 |
시작열 |
끝 열 |
데이터 유형 |
Subj |
Subject Number |
1 |
3 |
문자형 |
DOB |
Date of Birth |
4 |
13 |
문자형 |
Gender |
Gender |
14 |
14 |
문자형 |
Balance |
Bank Account Balance |
15 |
21 |
숫자형 |
1234567890123456789012345<-열 번호 |
00110/21/1955M 1145 00211/18/2001F 18722 00305/07/1944M 123.45 00407/25/1945F -12345 |
이런 자료 입니다
자 다음 코딩을 살펴 보시죠
data financial;
infile 'c:\books\learning\bank.txt';
input Subj $ 1-3
DOB $ 4-14
Gender $ 14
Balance 15-21;
run;
보시다시피 변수명을 지정해줄 수 있고 그 시작열과 끝열을 써줌으로써 어떤 데이터를 사용할지 구체적으로 지시해주고 있습니다. 그리고 데이터가 문자형이면 $기호를, 숫자형이면 아무것도 써주지 않습니다.
proc print 를 이용하여 financial을 출력을 해보겠습니다
SAS 시스템 1
2011년 01월 31일 월요일 오후 02시53분11초
OBS Subj DOB Gender Balance
1 001 10/21/1955M M 114.0
2 002 11/18/2001F F 1872.0
3 003 05/07/1944M M 123.4
4 004 07/25/1945F F -1234.
7.고정된 열에 저장된 데이터를 읽어들이기 : 2. Formatted Input
Formatted Input을 사용하는 목적은 다른게 없습니다. 만약 돈을 표시하고자 합니다. 이때 당연히 숫자형 변수를 다루겠죠? 하지만 여기서 포맷을 적용을 한다면 $기호라든가 천단위마다 쉼표를 표시해준다든가 등 다양한 형태로 데이터 값을 표시해줄 수 있습니다. 다음 코딩을 살표 보시죠
data financial;
infile 'c:\books\learning\bank.txt';
input @1 Subj $3. @4 DOB mmddyy10. @14 Gender $1. @15 Balance 7.;
run;
여기서 @ 는 Column pointer로 말 그대로 값으 시작 열을 지정해주는 것입니다. 예를들어 @4는 SAS로 하여금 4번 열로 가라는 것입니다. 그리고 $3, mmddyy10같은 것들은 Informat이라고 하는데 이는 SAS에 저장되있는 변수 값들의 표현형식을 지정해주는 것입니다.
Informat |
기능 |
W. |
기본 숫자형 포맷 |
$W. |
기본 문자형 포맷 |
COMMAw. $12,345 |
숫자형 포맷을 읽어 들임과 동시에 기호를 삭제 12345 |
MMDDYYw. 10/29/02 |
연월일 data를 숫자로 변형 15642 |
proc print를 이용해 출력을 해볼까요?
SAS 시스템 3
2011년 01월 31일 월요일 오후 02시53분11초
OBS Subj DOB Gender Balance
1 001 -1533 M 114.0
2 002 15297 F 1872.0
3 003 -5717 M 123.4
4 004 -5273 F -1234.0
DOB의 값들이 숫자로 나왔음을 확인하실 수 있을 겁니다. 이것이 바로 Informat 구문의 영향인데요, 어떤 분은 왜 굳이 숫자로 바꾸려고 하는 것인가? 라고 질문을 하시는 분이 계신데 이는 자료 사용 용도의 차이라고 밖에 설명을 해드릴 수 밖에 없네요^^
수고하셨습니다. 정답은 다음주에 댓글로 달아드리겠습니다.^^ 즐거운 한주 보내세요~
본 자료의 저작권은 sas에 있습니다
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.