BookmarkSubscribeRSS Feed

[예제로 배우는 SAS] 3. Reading Raw Data From External Files

Started ‎06-11-2020 by
Modified ‎06-11-2020 by
Views 259

2.PNG

 

안녕하세요. MYSAS입니다.

 금주는 외부 파일을 읽어드리는 법에 대해서 알아보겠습니다

 

 

 

목  차

  1. Introduction
  2. Blank로 나눠진 데이타 값 읽어내기
  3. List Input으로 결측값 구체화 시키기
  4. Comma로 나눠진 데이타 값 읽어내기
  5. Blank, Comma가 아닌  구분문자(Delimiter)로 나눠진 데이터 값 읽어내기
  6. Data 열을 직접 입력해 버리기 
  7. 고정된 열에 있는 데이터 값을 읽어드리기

 

 

 

  1.  Introduction

  사용하시고자 하는 자료가 이미 SAS 데이터 셋에 있다면 이 장을 보시지 않으셔도 좋습니다. 

 

  SAS에서는 text file로 부터 파일을 읽어드리는 여러가지 방법이 있는데요 이는 데이터들이 어떻게 배열되어 있냐에 따라 달라집니다. 여러분은 그중에서 가장 편한 방법을 사용하기만 하시면 되죠. 다음 두가지 방법을 살펴 보도록 하겠습니다

 

  1. Blank 로 나눠진 데이터 값 읽어내기 

 

저번 시간에 이어 같은 파일을 읽어낸다고 가정해봅시다

 

 

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;

 

코딩을 쓰면 파일을 잘 읽어낼 수 있을 것입니다. 

 

 

  1. 결측값을 구체화 시키기 

 

 

이번엔 파일의 모습을 살짝 바꾸어 보겠습니다

 

 

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에 대한 간략한 설명 들어갑니다

 

  1. Delimiter-Sensitive Data의 약자로써 INFILE 옵션에서 쓰입니다
  2. 원래는 delimiter의 디폴트 값이 빈칸이였는데 comma를 디폴트 값으로 인식을 합니다. 
  3. 만약 두개의 delimiter가 연속으로 있으면 그 사이에 결측값이 있다고 가정을합니다. (즉 컴마가 연속으로 있다면 그 사이는 결측값이라 하는 것이지요)
  4. 문자형 값이 큰따옴표나 작은 따옴표로 둘러 싸여있을 경우 그 따옴표를 볏겨내는 역할을 합니다. 

 

 

  1. Blank, comma가 아닌 다른 Delimiter로 나눠진 값들을 읽어내기 

 

 

간혹 이런 파일이 있을 수 있지요

 

 

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의 디폴트 값을 컴마가 아닌 따옴표 안에 있는 기호, 

즉 위 코딩에서는 콜론으로 바꾸게 되는 것이죠. 

 

 

  1. Data 열을 직접 입력해 버리기

 

외부에서 읽어드리지 않고 이번엔 그냥 직접 입력해서 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

 문자형

DOB 

 Date of Birth 

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에 있습니다

Version history
Last update:
‎06-11-2020 09:14 PM
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