[SAS 활용 노하우] 데이터 입력하기 part2
- Article History
- RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
1.5 그룹포맷입력
통계조사 데이터를 입력할 때 동일 포맷을 공유하는 변수들이 연이어 나타나는 경우가 많습니다. 이때 각 변수마다 개별적으로 포맷을 지정하는 것은 비효율적입니다.
예를 들어, x1,x2,x3,x4,x5가 네 자리 정수를 받는 숫자 변수라고 가정하고, 5개 변수가 1열부터 20열 사이에서 중간에 빈칸 없이 입력된다고 합니다.
위와 같이 데이터 값 사이에 빈칸이 없으면 고정포맷으로 입력하는 것이 수월합니다.
1) 원시적인 포맷 입력
INPUT x1 4. x2 4. x3 4. x4 4. x5 4.;
2) 그룹포맷
/*1*/
INPUT (x1 x2 x3 x4 x5) (4. 4. 4. 4.);
그룹 포맷은 단축 표현이 가능하고 포맷이 4.으로 모두 동일하므로 더 간단히 사용할 수 있습니다.
/*2*/
INPUT (x1-x5) (5*4);
SAS에서는 편리하게 변수의 개수가 포맷 수보다 많으면 주어진 포맷이 처음부터 다시 재사용됩니다. 이를 이용하면 위의 INPUT 문장은 다음과 같이 더욱 간단히 쓸 수 있습니다.
/*3*/
INPUT (x1-x5) (4.);
그룹포맷을 사용할 때 한 가지 유의할 점은 변수목록과 포맷목록에 항상 괄호를 사용해야 합니다.
다음 아래와 같은 그룹포맷 지정은 전부 잘못된 것 입니다.
INPUT (x1-x5) 4.;
INPUT x1-x5 (4.);
INPUT x1-x5 4.;
변수목록이 포맷목록보다 더 많은 경우 아래와 같이 사용됩니다.
1번째 INPUT 예시와 2번째 INPUT 예시는 같은 역할을 합니다.
INPUT (name x1 - x5) ($20. 5*4);
다른 그룹 포맷 방식입니다.
name 변수를 읽기 위해 처음 20칸에서 읽고 그 다음 x1부터 x5까지 읽습니다.
1.6 DATALINES ( 또는 CARDS) 문장
DATALINES(또는 CARDS)문장은 직접 데이터를 입력할때 사용하며 바로 다음 줄부터 데이터가 입력됩니다. 따라서 이런 경우에 DATALINES 는 DATA 단계의 가장 마지막 문장이 됩니다.
하나의 DATA 입력에 둘 이상의 DATALINES 문장은 나오지 못 합니다.
DATA temp;
INPUT x y;
DATALINES;
1 2.2
2 4.0
3 5.7
4 8.4
5 9.9
RUN;
DATA 입력 단계의 끝은 RUN으로 마쳐야 합니다.
1.7 INFILE
INFILE문은 외부 텍스트 데이터 파일을 입력할 때 사용합니다.
즉, 분석하고 싶은 자료가 SAS 프로그램 내에 포함되어 있지 않고 외부에 따로 저장되어 있을 때 사용합니다. INFILE 문장 다음에는 반드시 INPUT 문장이 나와 외부 파일에 수록된 데이터를 읽는 방식을 지정해야 합니다.
INFILE 문장은 다음과 같은 문장으로 구성됩니다.
DATA SASdataset;
INFILE 'filename';
INPUT;
RUN;
조금의 변형이 있을 수는 있지만 다음과 같은 형태가 INFILE 문장을 이용한 다음과 같은 형태가 가장 대표적인 DATA단계입니다.
1.8 자료입력 포맷의 지정
지금까지 DATA단계에서 자료를 직접 입력한 경우에는 INPUT 문을 사용하고 반드시 DATALINES(또는 CARDS) 문장 직후부터 데이터가 들어옵니다.
만약 외부파일로 저장된 데이터를 입력할 때는 INFILE문을 사용하며 특수한 경우를 제외하고는 일반적으로 DATALINES 문장이 필요없습니다.
그런데 데이터 입력시 포맷을 지정해야 할 때가 있습니다.
특히, 대규모 데이터를 입력할 때는 데이터 입력 속도의 증진을 위해 데이터 값 사이에 빈칸을 두지 않는 것이 상례입니다. 이런 경우에는 반드시 데이터 입력 포맷을 지정해야 합니다. 숫자를 입력할 대 지정해야 하는 기본적인 사항은 숫자의 전체 자릿수와 소수점 이하의 자릿수입니다.
예를 들어, -123.456은 모두 8칸의 공간이 필요하고 그 중 소수점 이하 자릿수는 3칸이 필요합니다.
숫자를 나타낼 칸 수를 계산할 때는 항상 숫자의 부호와 소수점이 차지하는 2칸을 염두해야 합니다. 입출력되는 숫자가 전부 0보다 큰 것이 확실하면 부호가 차지하는 1칸은 뺄 수 있습니다.
그리고 문자열 입력시 고려해야 하는 것은 문자열의 길이 한 가지 뿐입니다.
이 때, 문자열의 시작부분이 빈칸이냐 아니냐에 따라 입출력 방식이 달라집니다. 문자변수의 입력방식에는 항상 '$' 기호가 붙습니다.
w. 또는 w.d
다음의 정의에서 'w'는 입력되는 값이 차지하는 수, 'd'는 소수점 이하의 자릿수입니다.
따라서, d 값은 w값보다 항상 작습니다. 문자열의 경우에는 'd'를 지정하지 않습니다.
SAS에서는 숫자를 읽는 표준형이나 입력방식의 이름이 따로 없습니다.
'w.'는 소수점 이하 ㅈ릿수가 없는 정수의 입력에 쓰이며 부포를 포함하여 최대 32자리까지 숫자를 읽을 수 있습니다. 물론 부호와 숫자 사이에 빈칸이 있을 수 없습니다.
'w.d'는 상당히 융통성있는 방식으로 'w'로 지정된 칸 사이에 아무 곳이나 숫자를 넣을 수 있고 그 숫자에 소수점이 없으면 10^d로 나눈 값이 입력됩니다. 소수점이 이미 붙은 숫자나 지수부포 E를 사용한 숫자라면 보이는 그대로 입력됩니다. 숫자 좌우의 빈칸은 있더라도 무시됩니다. 데이터값이 분실된(missing) 경우에는 아무 곳에나 마침표를 넣습니다.
[EX1]
DATA a;
INPUT @1*7.;
DATALINES;
-23****
****-23
**-23**
*-23.0*
-2.3E01
;
RUN;
EX1를 실행하면 모든 데이터는 -23으로 입력됩니다. '*'은 숫자를 의미하지만 편의상 '*'로 표기하였습니다. 사용된 입력방식은 7. 입니다.
[EX2]
DATA b;
INPUT y 1-6 6.2;
DATALINES;
1234**
**1234
*12.34
;
RUN;
사용된 입력방식은 6.2이고 위의 예시를 실행하면 어떠한 관측도 12.34로 입력됩니다.
$w.
문자 데이터를 읽는 SAS의 표준 입력방식입니다.
문자열 왼쪽의 빈칸은 무시되고 입력된 문자열은 왼쪽 기준으로 정렬됩니다.
데이터 값이 분실된 경우에는 숫자와 마찬가지로 마침표를 사용하여 데이터 값이 없음을 표시합니다.
[EX3]
DATA c;
INPUT @1 country $7.;
DATALINES;
KOREA**
*KOREA*
**KOREA
;
RUN;
위의 예시를 실행하면 모든 값이 'KOREA**'라고 입력됩니다.
1.9 OUTPUT
OUTPUT문은 이 문장이 나오기 직전까지 입력된 데이터 값을 지정된 SAS 자료의 관측으로 출력합니다. 필요에 따라 하나의 DATA 단계 내에 n번 나타날 수 있습니다.
OUTPUT SASdataset;
여기서 SASdataset은 현재까지 입력된 데이터값이 관측으로 저장되는 SAS 자료의 이름입니다. 2개 이상을 지정할 수 있습니다. 단순히 DATALINES 문장 다음에 나오는 데이터값을 입력할 경우에는 OUTPUT을 사용할 필요가 없습니다.
DATA sample;
INPUT x y;
z = x+y;
DATALINES;
1 23
2 15
3 36
;
RUN;
간단한 sample 데이터를 만들었습니다. 첫 번째 관측을 읽어 x 와 y에 값을 입력하고 합해서 새로운 변수 z 를 계산한 다음 DATALINES 외에 더 이상의 문장이 없으므로 지금까지의 결과가 sample로 저장됩니다.
위와 같이 단순한 DATA 입력 단계에서는 DATALINES 문장과 만나는 순간 명시하지 않아도 자동적으로 OUTPUT문장이 실행됩니다.
OUTPUT의 기본적인 역할은 입력자료의 구조를 변형시켜 분석하기 쉬운 형태로 바꾸는데 있습니다. OUTPUT을 잘 사용하면 하나의 관측을 읽어 둘 이상의 자료로 저장할 수 있고, 읽어 들인 자료를 분할하여 동시에 둘 이상의 자료를 만들 수 있습니다.
DATA단계에서 OUTPUT 문장이 사용되면 DATALINES 문장이 있더라도 자동 저장이 되지 않습니다.
OUTPUT 문장이 사용된 DATA 단계에서 대부분의 경우 최종 OUTPUT 문장이 DATA 단계의 마지막 실행문이 됩니다.
하나의 DATA 입력 단계에서 동시에 둘 이상의 SAS 자료를 만드는 경우를 알아보고자 합니다.
DATA stat math;
INPUT course $ name $ score1 score2 score3;
IF course = 'stat' THEN OUTPUT stat;
ELSE OUTPUT math;
DATALINES;
stat Sung 30 30 40
math Kim 20 20 30
stat Lee 10 10 20
math Park 25 25 35
Run;
이 DATA 단계를 실행하면 stat 과 math 2개의 자료가 만들어집니다.
입력변수는 과목(course), 이름(name), 그리고 3개의 성적(score1, score2, score3)입니다.
IF 문장에서는 만약 과목이 'Stat'이면 읽어 들인 관측을 stat으로 처리하고 아니면 math로 저장합니다.
입력된 데이터에서는 첫 번째와 세 번째 관측자료가 stat에 들어가고, 나머지는 math에 들어가게 됩니다.
위의 예시는 지정된 변수 값에 따라 자료를 분할할 수 있음을보여줍니다.
PROC PRINT DATA = stat;
RUN;
stat을 출력할 때는 위와 같이 PROC PRINT로 호출합니다.
1.10 반복 DO
반복 DO(iterative DO) 문장은 DO로 시작하여 END로 끝나는 DO 그룹을 여러번 반복 실행하고자 할 때 사용합니다.
DO index = stat To stop BY inc;
( sas statements);
END;
여기서 SAS statements는 실행 가능한 SAS 문장이 들어간다는 의미입니다.
Do 반복 실행횟수는 지표변수(index variable)의 값에 의존합니다.
index는 지표변수, start는 지표변수의 초기값, stop은 상한값, inc는 지표변수의 증가분 입니다.
증가분의 기본값은 +1이며 음수도 가능합니다.
반복 DO 문장은 지표변수 값이 초깃값 이상 상한값 이하에 있을 때에 DO 반복문을 실행합니다. TO와 BY 구문은 불필요하면 생략할 수 있습니다. 그리고 지표변수 값은 END 문장에 부딪히면 자동적으로 증가분만큼 증감합니다.