SAS를 이용하여 분석을 수행하기 위해서는 가장 먼저 데이터셋을 만드는 작업이 필요합니다.
특히 원자료가 텍스트 형식의 파일로 저장되어 있는 경우가 있습니다. 이번 게시글은 다양한 형태의 텍스트 자료를 읽어서 SAS 데이터셋을 생성하는 방법에 대해서 설명하겠습니다.
SAS 데이터셋을 생성하기 위해서는 가장 먼저 수행해야 할 일 중의 하나는 원자료가 어디에 위치하고 있는지를 지정하는 것입니다.
데이터는 프로그램 내부에 입력될 수도 있고 독립된 파일로 외부에 존재할 수도 있는데, 데이터의 양이 적은 경우에는 하나의 프로그램 파일 안에서 데이터와 프로그램을 관리할 수 있기 때문에 자료를 프로그램 내부에 입력하는 것이 편리합니다.
하지만 데이터의 양이 매우 크거나 이미 다른 소프트웨어에서 데이터가 텍스트로 입력되어 있는 경우에는 독립된 외부 파일로 데이터를 구성하는 것이 데이터의 입력 또는 관리에 편리합니다.
INFILE 명령문은 데이터를 외부 파일로부터 읽는 경우에 외부 파일의 경로와 파일 이름을 지정하는 명령문입니다. 이때 외부 파일은 특별한 경우를 제외하고는 텍스트파일(text file 또는 ASCII file)로 저장되어 있어야 합니다.
DATA WORK.PERSON;
INFILE '/home/u45061472/성적.txt';
INPUT NAME $ DEPT $ SALARY AGE;
RUN;
INFILE 명령문을 사용하여 자료를 읽을 수 있고, INPUT 명령문은 변수 이름 및 유형을 지정하기 위해 사용됩니다. 이번 예제에서는 변수 NAME 또는 DEPT 와 같이 니다. 문자변수인 경우에는 변수 이름 뒤에 $ 표시를 해줘야 합니다. INFILE 명령문은 항상 INPUT 명령문 앞에 위치해야 하며, 경로를 포함한 이름을 인용부호(' ')로 닫아야 합니다. 또한, INFILE 명령문에는 외부 파일의 형태로 지정할 수 있는 여러 가지 옵션들이 추가로 사용할 수 있습니다.
DATA WORK.PERSON;
INPUT NAME $ DEPT $ SALARY AGE;
CARDS;
김철수 STAT 96 38
최민지 MATH 89 42
이영희 ECON 98 55
오인수 STAT 102 39
;
RUN;
CARDS 명령문은 원자료가 프로그램 내부에 입력되어 있음을 지정하는 명령문입니다.
SAS는 CARDS 뒤에 위치하는 모든 자료값들은 ;(Semicolon)이 나타날 때까지 원자료로 인식합니다.
따라서 CARDS 명령문 및 원자료 그리고 ;(Semicolon)을 포함하는 부분은 데이터 단계의 제일 마지막에 위치하고 있습니다. 위의 예제는 네 개의 개체에 관한 원자료를 프로그램 내부에 입력한 예입니다. 앞에서 설명한 바와 같이 ;(Semicolon)은 한 명령문의 끝을 나타내기도 하지만, 이번 예제에는 원자료의 끝을 나타내기도 합니다.
'2. CARDS: 원자료를 내부에 입력'에서 작성한 예제는 모든 자룟값이 하나 이상의 공백문자 (blank 또는 space)에 의해서 분리되어 있는 경우를 데이터가 자유포맷(free format)으로 입력되어 있다고 합니다. 데이터가 자유포맷으로 입력되어 있는 경우에는 INPUT 명령문은
INPUT NAME $ DEPT $ SALARY AGE;
에서와 같이 주어진 변수 이름의 순서대로 입력 데이터를 읽게 되는데, 이와 같은 INPUT 문의 형식을 LIST INPUT 이라고 합니다. 이때 문자를 자료값으로 가지는 문자변수(character variable)의 뒤에는 특수기호 $를 표시해 주어야 합니다.
자유포맷에 의한 입력은 가장 쉽고 단순하지만, 이를 위해서는 다음과 같이 지켜야 할 몇가지 규칙이 있습니다.
1) 데이터의 모든 자룟값들은 적어도 하나 이상의 공백문자에 의해서 분리되어 있어야 합니다.
만약 다른 구분자(delimiter, separator)를 사용한 데이터가 입력되어 있는 경우에는 INFILE 명령문과 DLMD 옵션을 사용하여 구분자를 지정해 주어야 합니다.
2) 각 결측값(MISSING VALUE) 은 한 개의 마침표(,)로 표시되어 있어야 합니다.
3) 문자변수의 자룟값은 공백문자를 포함하지 않아야 하고, 길이가 8자리를 넘지 않아야 합니다.
만약 문자변수의 자룟값이 8자리를 넘어가게 되면 8자리만을 데이터셋에서 저장하게 됩니다. 문자변수에 대한 이와 같은 현상을 방지하기 위해서는 LENGTH 명령문을 사용해서 문자변수가 저장될 바이트의 수를 미리 선언해 주어야 합니다.
DATA WORK.GRADE;
INPUT ID NAME $ CLASS $ SCORE GRADE $;
CARDS;
2590 JOHN STAT 80.3 A
3569 WILLY MATH . B
7048 YOUNGHEE . 30.6 C
9087 . ENG 100 A
. E.T . . .
;
RUN;
앞에서 설명한 바와 같이 SAS 에서는 대.소문자를 구별하지 않지만 위의 결과에서 볼 수 있듯이 문자변수의 자룟값이나 TITLE 명령문에서 사용된 제목내용 등에 대해서는 대.소문자를 구분합니다.
데이터가 공백문자나 다른 구분자에 의해서 분리되어 있지 않은 경우에는 앞에서와 같은 자유포맷에 의해서 자료를 읽을 수 없습니다. 그러나 모든 데이터의 자룟값들이 열에 맞추어 정리되어 있다면 이를 데이터가 고정포맷(FIXED FORMAT)으로 입력되어 있다고 하고, 입력 포맷 또는 열지시자에 의해서 데이터를 읽어들일 수 있습니다.
DATA WORK.GRADE1;
INPUT NAME $ 11-18 CLASS $ 20-35 CLASSID 1-4 SCORE 36-40 GRADE $ 41;
CARDS;
259067048 김철수 STATISTICS 80.3A
356989087 박민호 MATHEMATICS B
704872534 이영희 30.6C
908727844 ENGLISH 100 A
424573465 남궁수지 COMPUTER SCIENCE
;
RUN;
INPUT 명령문에 사용되는 열지시자(column indicator)는 고정포맷으로 입력된 각 변수의 시작 열과 끝 열을 지정하는 것으로써 다음과 같은 사용형식을 가지고 있으며, 이와 같은 INPUT 문의 형식을 Column Input이라고 합니다.
INPUT variable <$> start-column-end-column;
이러한 고정포맷은 자유포맷을 사용하는 것에 비해서 다음과 같은 이점을 가지고 있습니다.
1) 자룟값들 사이에 공백문자를 입력하지 않아도 됩니다.
2) 문자변수가 공백문자를 포함할 수 있으며, 최대 32,767 자리까지 자룟값을 가질 수 있습니다.
3) 결측값을 공백문자로 처리할 수 있습니다.
5) 필요없는 변수에 대해 자룟값을 읽지 않을 수 있습니다.
6) 읽을 열의 위치가 지정되므로 어떤 순서로 읽어도 무방하며 같은 열을 반복하여 읽을 수도 있습니다.
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.