자 6장이다..
지금까지 배운것을 열심히 하라는 선생님의 말씀과 함께 노력해보자
SAS와 SPSS의 차이점에 대한 설명이 나온다.
프로그램 활용과 프로그래밍에 익숙하다면 SAS가, 아니라면 SPSS가 편하다고 한다.

DATA문은 SAS 데이터셋을 만들고 PROC문은 해당 SAS 데이터넷을 처리한다.

SAS 프로그램의 구조를 알아보자

DATA a1; INPUT (x y) (1. 2.);
CARDS;
1 2                                                                                         DATA 부분
2 5
3 8
;
PROC PRINT; VAR x y; RUN;                                                     PROC 부분
DATA a2; INPUT x y z; CARDS;
4 5 1.1                                                                                    DATA 부분
5 2 3.2
PROC MEANS; RUN;                                                                PROC 부분
DATA bb; SET a1 a2;                                                                DATA 부분
xsq=SQRT(x);                                                                         자료변형 부분
PROC REG; MODEL y=x xsq;                                                    PROC 부분
PROC PRINT DATA=a2; RUN;

DATA문은 SAS 데이터셋을 만들고 PROC문은 해당 SAS 데이터넷을 처리한다.

간단한 프로그램을 하나 작성해보도록 하자.
♥♥♥♥♥
DATA a1;                                                                                                                               
INPUT x y;                                                                                                                             
CARDS;                                                                                                                                 
1 2                                                                                                                                    
3 4                                                                                                                                    
;                                                                                                                                      
PROC PRINT; VAR x y;                                                                                                                   
RUN;                                                                                                                                  
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 17일 토요일 오후 02시03분58초   1

                                                       OBS    x    y

                                                        1     1    2
                                                        2     3    4

♥♥♥♥♥
SAS 데이터셋 이름 - 32자 내의 임의의 영문자(A~z,_)나 숫자 사용
SAS 변수명 - 32자 내이며, -(하이픈)은 사용 불가
SAS 변수값 - 숫자형 변수, 문자형 변수, 날짜 및 시간형 변수, 16진수 문자형 변수, 16진수 숫자형 변수

아...잠들었다. 깨어나보니 2시간이나 지났네. 점심을 맛있게 먹어서일까 식곤증이 참...
PROC 문이 무언가 자료를 원하는 형태로 연산해서 돌려주는 것은 알겠다.
PROC문을 2개쓰면 결과도 2개! 3개쓰면 3개!!가 된단다.
출력창에 보면 어제 5과에서 엄청난(?)규모의 프로그램을 돌렸을때도 알 수 있지만,
결과가 여러 카테고리로 나눠져서 나오는 것을 볼 수 있다.
아마도 그것이 PROC문의 갯수라고 생각하면 되겠다.

그렇다면 2개의 PROC문을 한 번 작성해보도록 하자.
(너도 이거 작성하는거 초보자나!! 라고 뭐냐고 말씀하시는 분들이 있으실 것 같은데,
작성하자고 하더라도 어차피 책의 내용을 고대로 따라하는 것이라서 그렇게 생각하지 않았음 좋겠다.

<1개의 데이터에 여러 개 프로시저(PROC 문)을 사용하는 경우>
♥♥♥♥♥
DATA a1;                                                                                                                               
INPUT x y;                                                                                                                             
CARDS;                                                                                                                                 
1 2                                                                                                                                    
3 4                                                                                                                                    
;                                                                                                                                      
PROC MEANS; VAR x y;                                                                                                                   
proc REG; MODEL y=x;                                                                                                                   
RUN;
♥♥♥♥♥
음... REG가 연산 에러가 난다. 왜지...
아무튼 모르겠다... 넘어가자...ㄱ- 하다보면 또 발견될지도...

자 다음에 공부하는 것은 결과가 꼭! 출력되기를 바라면서 해보도록 하자.
변수명을 한글로 표현하는 방법이다.
우리가 보통 출력할때 보면 이렇게 나오지 않는가.
위에서 살짝 가지고 내려오면,
                                                        SAS 시스템            2007년 02월 17일 토요일 오후 02시03분58초   1

                                                       OBS    x    y

                                                        1     1    2
                                                        2     3    4

x, y 이런식으로 나오는데 결과가 한글로 써 있으면 보는 사람도 이해가 빠를 것이다.
위에것을 예로 들자면 철수와 영희는 두 번 과자를 훔쳐먹었는데,
1번째에 철수는 1개를 영희는 2개를 훔쳐먹었고,
2번째에 철수는 3개를 영희는 4개를 훔쳐먹었다는....(ㄱ- 영희는 욕심쟁이...)
아무튼, 이해하기가 쉬울 수 있다.

이 내용을 가지고 코딩을 해보자. 한글 표현은 Label문을 활용하면 된다고 한다.

<변수명을 한글로 표현하기: LABEL문>
♥♥♥♥♥
DATA a1;                                                                                                                               
INPUT x y;                                                                                                                             
LABEL x='변수 1' y='변수 2';                                                                                                           
CARDS;                                                                                                                                 
1 2                                                                                                                                    
3 4                                                                                                                                    
;                                                                                                                                      
PROC PRINT LABEL;                                                                                                                      
RUN;                                                                                                                                   
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 17일 토요일 오후 04시50분27초   4

                                                           변수    변수
                                                    OBS      1       2

                                                     1       1       2
                                                     2       3       4
♥♥♥♥♥
아까 x y 부분이 변수1 변수2로 바뀐것을 볼 수 있다.
철수하고 영희도 문제 없을 것 같다.
근데, 위는 그렇다고 쳐도, 왼쪽에 1과 2는 어찌 바꾸는거지....
철수 영희 1번째 2번째 이렇게 바꾸면 우리의 가설과 매칭시킬 수 있을 것 같은데...

자 아무튼 우려했던 결과 펑크는 일어나지 않았다.
다행이라는 생각과 함께, 다음 페이지를 보니.. 제목이 '한 단계 복잡한 형태'
그렇다. 이제 우리도 한 단계 진화할 수 있는 자격을 지닌 것이다. (책 제목 멋집니다..조인호 선생님;)
일단 뭐가 복잡해졌는지 코드를 살펴보도록 하자.
♥♥♥♥♥
DATA a1; INPUT x y;                                                                                                                    
x2 = x**2+y;                                                                                                                           
xlog = LOG(x);                                                                                                                         
CARDS;                                                                                                                                 
1 2                                                                                                                                    
3 4                                                                                                                                    
;                                                                                                                                      
PROC PRINT; VAR x y x2 xlog;                                                                                                           
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 17일 토요일 오후 04시50분27초   5

                                              OBS    x    y    x2      xlog

                                               1     1    2     3    0.00000
                                               2     3    4    13    1.09861
♥♥♥♥♥
a1이라는 데이터셋 이름을 만들고, x y를 변수로 입력한다.
x2라는 이름의 변수에는 x의 제곱에 y를 더한것이다. (x**2가 x의 2제곱을 의미한다. 보통 x^2 이런식으로 쓰지 않던가??...암튼 그렇다니 알아두자.)
xlog라는 이름의 변수는 log(x)의 값을 나타낸다.
원시자료를 변형하거나 새로운 변수를 만드려면 등호(=)를 기준으로 좌측에 변수를 우측에 수식을 주면 된다.

그리고 한가지 실수하지 말하야 할 사실은 CARDS라는 데이터가 들어가기 전에, 자료 변형에 대해 모두 언급을 해 줘야 한다는 것이다. 뭐 사람의 생각으로는 자료가 먼저 나와야 연산을 할 수 있는게 아니냐 싶어서 자료 뒤에 써주고 싶겠지만, 일도 그렇지만 방향을 잡은뒤에 일을 시작하면 훨씬 수월하고 빠른 법이다. 또한 코딩전에 개발자들끼리 무언의 룰이라는게 있어야 내가 짠 프로그램을 다른 사람이 자신의 목적에 맞게 수정하기 편한점도 있다. 우리는 어떤 SAS 프로그래머의 코드를 변형시키더라도 CARDS; 앞에 연산 구문들이 있다는 것을 반대로 알 수 있는 것이 아니겠는가..ㅡㅡㅋ

뭔가 장황하게 써 놓았는데 별거 아니다. CARDS; 앞에 자료 변형에 대한 구문을 써주자는 것이다.
강압이 아니다. 아니면 프로그램 오류 난단다 ㄱ-;

우리가 열심히 달려온 3일(ㄱ- ..별로 안되었다... 뭔가 많이 들어간 듯 보였는데...)
몇몇 코드를 보면서 할만 할 것 같은데, 이거 나중에 말도 안되게 어려워지는 것이 아닐까 하는 생각이 든다.
하지만 짧은 인생 살아본 바로는, 무섭다고 한 발자국 나아가지 않으면 거기까지가 내 지식의 한계가 되고,
나보다 한 발자국 더 나아간 사람과 대화를 나눌때면, 그 사람이 나보다 백보는 더 많이 나간 것처럼 느껴진다.
사실은 한 보 차이인데... 지식과 정보란 그런것이다. 아는 것이 힘이다. 고로 우리는 체력이 닿는 한 달려야 한다.

뭔 말하다 오늘 이렇게 장황해 지는거지. 잠자서 약간 히트업 되었나보다.
공부했던 것 중에서 DATA a1; 으로 구문 막 짜다가 DATA b1; 등장하던 것이 있던것 기억할 것이다.
이거 어떻게 쓰는거야? 하는 생각 해 봤으려나;
더 웃긴것은 맨날 DATA b1; 뒤에는 SET a1;이 따라다닌다.
이거 한 번 알아보자. 싫음 말구~

아 참! 그리고 위에서 PROC PRINT; VAR x y x2 xlog; 이렇게 쓰는데 PROC PRINT; 만 써도 결과 값 똑같다.
고로, 뭐가 출력되는지 모를때는 VAR를 붙이지 않고 출력한뒤, 내가 출력하고픈 변수를 선택하는 것도 좋은 방법이라고 생각한다.

DATA a1; INPUT x y;                                                                                                                    
CARDS;                                                                                                                                 
1 2                                                                                                                                    
3 4                                                                                                                                    
;                                                                                                                                      
DATA b1; SET a1;                                                                                                                       
x2 = x**2+y;                                                                                                                           
xlog = LOG(x);                                                                                                                         
PROC PRINT; VAR x y x2 xlog;                                                                                                           
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 17일 토요일 오후 04시50분27초   8

                                              OBS    x    y    x2      xlog

                                               1     1    2     3    0.00000
                                               2     3    4    13    1.09861
♥♥♥♥♥
a1이라는 이름의 데이터셋을 만든다. x y라는 변수가 입력되겠지.
자료는 다음과 같다
1 2
3 4

b1이라는 데이터셋을 만들자. 이 때 데이터셋 a1을 이용한다.
데이터셋 b1에는 x2와 xlog변수와 각각의 수식 결과값이 추가된다.
출력하자.
돌려돌려

대충 이런 분위기다.
왜 같이 쓸 수 있는 것을 따로 나누냐! 라고 반문하는 사람이 있을지도 모르겠다.
하지만 나누는 것도 필요하다.
사랑도 나눠야 가능하고.... 아니 이게 아니라!! (사실 외롭다...ㅠ_ㅠ)
어떤 특정한 필요에 의해서 일시적으로 쓰는 경우가 있을 수 있다.
분식집에서 여러가지 메뉴를 파는데, 어느날 떡볶이와 순대의 매출액만을 보고 싶다고 하자.
저 2개를 위해서 나머지 메뉴들까지 뽑을 필요는 없지 않는가.
이럴때 원 자료만을 활용하는 것이다. 데이터가 작으면 괜찮지만 많아지면 연산에 걸리는 시간도 보통이 아니다.
SAS 통계 패키지로 떡볶이와 순대를 계산하는 사람은 없을 것 아닌가.
(혹 그런 생각으로 배우는 사람이 있다면 엑셀을 공부하는 것이 더 낫다고 생각한다)

여러가지 함수에 대해서는 9장에서 설명된다고 하니까 기대해보면 좋을 것 같다.
가볍게 3가지 정도만 봐볼까?

y=MOD(_N_,4): 관측치의 일련번호 (_N_)를 4로 나눈 나머지를 Y로 한다.
y=INT(X/100): X의 값을 100으로 나눈 몫의 정수 부분을 Y로 한다.
y=X-LAG(x): 데이터 X와 바로 앞 관측치 X와의 차이를 Y로 한다.

MOD는 나머지다. 이 약어는 다른 프로그래밍 언어에서도 많이 나온다. INT도 그렇고..
9 = 4 X 2 + 1 일때, 우리는 몫이 4, 나머지가 1 이라고 한다. (2로 나눴다고 가정)
이럴경우 INT=4, MOD=1로 결과값이 나온다. 엑셀에서도 해봐라. 나오나 안나오나..
엑셀에서 결과값을 얻고 싶다면 A1셀에는 9를, B1셀에는 2를 입력하고 C1셀에 '=INT(A1/B1)'을 D1셀에 '=MOD(A1,B1)이라고 입력하면 될 것이다. 어찌아냐고? 틀릴까봐 해보고 왔다....ㄷㄷㄷ
LAG 함수는 나도 모르는 함수다. 혹 엑셀에 나올까싶어서 두들겨봤더니 '=#NAME'이라고 나온다.
없는 함수 같다. 의미는 위에 써 놓았으니 참고하자.

SAS의 연산자를 알아보자.
일단 산술 연산자를 알아보자. 산술 연산자가 뭐냐고? 덧셈 뺄셈 곱셈 나눗셈....등등
쉽다. 오랜만에 쉬운거 나오니 행복하다.
+: 덧셈   -: 뺄셈   *: 곱셈   /: 나눗셈   **: 지수

그 다음은 비교 연산자이다. 말 그대로 비교다. 네가 크냐, 우린 같냐? 뭐 이런...
= : EQ (같다) - EQual
^= : NE (같지 않다) - Non Equal
> : GT(크다) - GreaT (자이언트가 아닐까 생각했다)
< : LT(작다) - LiTtle
<= : LE(작거나 같다) - Little or Equal
>= : GE(크거나 같다) - Great or Equal
^> : NG(크지 않다) - Non Great
^< : NL(작지 않다) - Non Little

영어 너무 어렵게 보지 말자. 부호가 더 중요할테니...

논리 연산자이다.
&: And    |: Or    ^: Not
쉬운데, Or의 저 부호가 어디 있는지 모르는 사람 있다. 저건 \표시 위에 쌍절곤 같이 생긴 글자로,
쉬프트(Shift)키 + \ 을 누르면 등장한다. 숫자 1이나 영문자 l 등으로 대체 할 수 있다고는 꿈에서라도 생각하지 말자.

기타 연산자 조금이다.
><: 최소값
<>: 최대값
||:
concatenation 이라고 써져있다. 연쇄? 연결? 뭐지 이건; 음... 글자를 이어주는 함수란다.
예를 들어서, DEVICE=ALPHA || MODEL;
ALPHA='IBM'이고 MODEL='3270'인 경우 DEVICE는 'IBM 3270'의 값을 갖는단다.

이제 슬슬 재미있는 것들이 봇물처럼 터지기 시작한다.
일단 DATA STEP의 기본 형태를 보자.

DATA 데이터셋명;
INFILE 외부 파일명;
INPUT 입력 변수명;
기타 DATA STEP에서 사용되는 문장;
(MERGE, SET, UPDATE)

DATA a1;
INFILE 'e:\sastest\sample.dat'
INPUT x y;
SET a1;
다 우리가 예전에 해봤던 문장 아니던가?
그렇다면 MERGE와 UPDATE는 뭘까. MERGE는 합친다는 의미다. 데이터셋을 합친다는건가?
UPDATE는 보통 덮어 씌우는 개념이였던 것 같은데...
아무튼, 나중에 또 나올테니 천천히 보자.

DATA문이다.
우리가 기초적으로 돌렸던 구문들의 명령어가 뒤로 좌악 줄서서 기다리고 있다.
오오.. 은행에서 창구 기다릴때 짜증나지 않는가. 우리가 빨리 배워야 손님 들어온다.
힘껏 달려보자.

형식: DATA [SAS 데이터셋[(옵션들)]]
주의사항: 32자 내의 임의의 영문자 숫자 사용. 특수문자 사용 불가.

1. 전형적인 모습
DATA a1;
작업중에 WORK.a1이라는 이름의 WORK파일이 임시로 생성되며, SAS 종료시 사라진다.

2. DATA _NULL_ 의 형태
DATA _NULL_; SET a1;
대형 워크스테이션이나 공동 작업의 경우 WORK.** 파일이 수도 없이 생기는데, 이때 디스크 공간 부족으로 작업이 중지될 수 있단다. 그래서, WORK.**파일을 생성하지 않고 작업할때 저런 형식을 취한다.

3. 데이터셋 이름이 없는 경우
DATA ; SET a1;
SAS를 실행하는 동안 생겨나는 순서에 따라서 DATA1, DATA2,.... 이름의 SAS 데이터셋이 생성된다고 한다.

4. 데이터셋 이름을 여러 개 지정하는 경우
DATA a1 a2 a3;
저렇게 써도 된단다. 그대의 내공이 출중하다면...
예를 하나 보자면,
DATA b1 b2 b3; SET a1;
IF X=1 THEN OUTPUT b1;
ELSE IF X=2 THEN OUTPUT b2;
ELSE OUTPUT b3;
뭐 이렇게 쓰인단다.

5. 데이터셋 이름이 두 단어로 되는 경우
DATA kkk.a1;
kkk는 라이브러리를 나타내며, 이렇게 하면 SAS 종료 후에도 중간과정이 저장되어있어 다시금 실행할 수 있단다.

6. DATA 문의 응용
이 외에도 DROP, KEEP, LABEL, RENAME, TYPE가 있다.
DATA A1(KEEP X1): 변수 X1만 들어 있는 SAS 데이터셋을 만든다.
DATA A1(DROP X1): 변수 X1을 제거한 SAS 데이터셋을 만든다.

세세하게 신경쓰지말자. 그럼 진도도 못 나갈 뿐더러, 의욕조차 상실하게 되니까.
정말 핵심적으로 공격이 들어올 때, 방어기재를 발휘하면 된다.

CARDS 문과 INFILE 문
CARDS문은 외부 파일을 이용하지 않고 프로그램 내에 직접 입력하는 경우 사용하며,
INFILE문은 반대로 외부 파일을 이용하는 경우에 사용한다.
INFILE문에는 옵션을 사용할 수 있단다... 오옷 +_+!!
일전에 우리가 탭 때문에 자료 못 돌리던거 기억하는가?
일전이라고 무지 옛날이라고 느끼는 것 같은데, 오늘 공부 시작한지 3일째다. ㄱ-+
이렇게 탭을 인식하지 못하는 경우를 위한 옵션이 있다.
EXPANDTABS; 옵션 구문이 그것이다. 한글로 궂이 설명하자면 확장탭들..ㅡ0-
사용법은 다음과 같다.
DATA a1; INFILE "e:\sastest\sample.dat' EXPANDTABS;
이런 식으로 말이다.
진작 가르쳐주지.. 일일이 다 고치느라 아주 죽는 줄 알았.....다.....는.......
아무튼, 그리고 다른 옵션을 살펴보면,
경우에 따라서 어디서부터 어디 까지의 자료를 쓰고 싶은 경우가 있다.
6번째부터 100번째 자료만 이용하고 싶다면 어떻게 할 텐가?
자료 파일을 열어서 5번째 이전과 101번째 이후를 날리고 새 파일을 만들까?
뭐 아주 모르는 경우라면 그것도 나쁘지 않겠지만,
그보다 좋은 방법이 있다.
DATA a1; INFILE 'e:\sastest\sample.dat' FIRSTOBS=6 OBS=100;

OBS가 뭐의 약자일까.. Observation. 즉, 관측이란 뜻의 의미이다.
책에서도 관측치라고 설명하니까 많는 듯 싶다.

INPUT 문
INPUT문은 읽어 들이고자 하는 데이터 변수의 이름과 입력 형식을 나타내는 문장이다.

1. INPUT 문의 형식
DATA a1; INPUT [변수명과 입력형식];
이런 INPUT문은 4가지로 구분될 수 있다는데... 뭘까?

① 자유형식(FREE FORMAT) : 데이터가 1칸 또는 그 이상의 빈칸으로 분리되어 있는 경우 사용. 문자형 변수인 경우 변수명 다음에 $를 붙인다.
INPUT 변수명, [변수명 $];
이거 우리 많이 봤다. 예를 들어 한 번 써보면 기억이 날랑가..

DATA a1; INPUT sex $ weight height;
CARDS;
f 56.3 167
f 45.6 156
m 76.2 176

성별을 나타내는 sex변수는 문자열을 쓰겠다는 것이고 그 다음은 몸무게, 그다음은 키의 변수가 각각 등장한다.

② 변수의 위치를 지정하는 방법: 연속되어 입력된 경우, 변수가 입력된 위치를 지정한다.
예를 들어서 확인하는게 이해가 더 빠를 듯 싶다. 말만 읽으면 나도 뭔소린지 모른다 --;

DATA a1; INPUT sex $ 1 weight 3-6 height 8-10;
CARDS;
f 56.3 167
f 45.6 156
m 76.2 176

sex변수는 1열에, 몸무게는 3에서 6열, 키는 8에서 10열을 사용한다는 뜻이다.
아마도 1열에 1개의 문자, 숫자 혹은 기호가 들어가는게 아닌가 싶다.
참고로 2열과 7열은 공백으로 처리된다.

③ 변수가 차지하는 열의 크기를 지정하는 방법: 열의 위치를 지정하는게 아니라 크기만을 지정하는 방법이다. 이 방법의 경우 X1, X2, X와 같이 연속적인 변수명을 사용하는 경우에 상당히 편리하다고 한다.

DATA a1; INPUT (sex weight height) ($CHAR1. +1 4. +1 3.);
CARDS;
f 56.3 167
f 45.6 156
m 76.2 176

뭐냐 이건. 다행이도 설명이 적혀있다.
일단 ()안에 변수명을 기입한다. 두번째 괄호에 열의 크기가 들어가는데...
처음에는 문자 1칸($char-> character: 문자), 한칸띄고(+1), 4칸(weight의 값이겠지?), 한칸띄고, 3칸(height의 값인듯)의 의미란다.
우리가 확인할 수 있는 것은, 값을 의미하는 경우, 마지막이 '숫자.'으로 끝난다는 것이며, 공백은 +숫자로 처리된다는 것이다. 그리고 이 모든것은 ()괄호로 묶인다.

조금 업그레이드 된 것도 같지만 난해해진 구문도 있다.

DATA a1; INPUT (X1-X3)(2*3. 4.);

무슨 의미인지 감이 온다면, 코딩의 마인드가 있는 사람일 것이다...
일단 앞서와 마찬가지로 앞은 변수명이다. 조금 다르다면 -(하이픈)인데,
맞다. 변수는 3개고 이름이 X1, X2, X3라는 의미이다.
그런데 왜 뒤쪽에 값이 이상하냐.. *는 뭐냐? 의문이 들 것이다.
일단 값은 '숫자.'이다. 그런데 '숫자.'이 두개 뿐이다. 3.과 4.이 그것이다.
머리속에 전구가 반짝반짝 하는가? 그렇다 3. 3. 4. 이라는 뜻이다. 2*는 산술적 의미처럼 두개라는 뜻.
고로 3. 이 두 번 나와서 3. 3. 4. 의 의미가 되는 것이다. 다시 쓰면,

DATA a1; INPUT X1 1-3 X2 4-6 X3 7-10; 이다.

④ 변수의 시작열의 위치(포인터)를 지정하는 방법을 이용한다(@이용): @를 이용하여 변수가 시작하는 열을 지정한 후 해당 변수가 차지하는 크기를 지정하는 방법이다. 갑자기 C언어 배울때 난해했던 포인터 부분이 생각난다. (아니 이 녀석 C언어도 배웠단 말야!!!)라고 생각하시는 분 분명 계실줄로 알지만, 쓰지 않으면 지식이란 자꾸 사라지고 자꾸 쓰면 발전하는 것이다. 말하고픈 요점은, 잘 안쓰고 있다...있다.....있다.......

DATA a1; INPUT sex $ 1 @3 weight 4. @8 height 3.;

음. 이건 대충봐도 느낌이 팍! 온다. 나만 그런가?
변수 sex는 문자열 1열이고, 3열을 시작으로 weight 변수는 4열을 쓴다. 즉 3~6열.
그리고 마지막으로 8열을 시작으로 height 변수는 3열을 쓴다. 즉, 8~10열.
2열 7열은 안쓰이니 공란임에 틀림없다.

이렇게 크게 4가지 방법으로 많이 쓰인다고 한다.

그럼 이거 말고 더 있단 말야? 그래 있다. 나도 모르는 무언가가 있다.
안그래도 기타 형식을 알려주려고 한다. 아니, 같이 배워나가는 것일까.

1) 소숫점이 있는 데이터를 읽는 법

DATA a1; INPUT sex $ 1 weight 3-6 time 8-10 .1;
CARDS;
f 56.3 167
f 45.6 156
m 76.2 176

여기서 우리는 추론할 수 있다. '.' 점의 의미에 대해서 말이다.
우리가 앞서 본 4. 이런것이 열을 나타낸다고 생각했다. 맞는 말인데, 정확히 말하면 값의 출력 양식과도 연관이 되는 것이였구나! 왜냐면, 소수점 표기를 봐라. '.1' 이건 소숫점 1자리로 나타내겠다는 의미의 반증이 아니겠는가. 실제 인풋 데이터를 확인하면 이해할 수 있을 것이다.
뭐? 근데 왜 167이냐고? 나도 쓰고 아닌가 생각했다. 그런데 책에 친절하게 씌여있다.
167은 16.7초임을 표시.
이걸로 되었을까? 의문점이?
쓰기에 따라서는 차라리 앞에처럼 소숫점으로 표기하는게 이해하는데 편할지도 모른다는 생각이 든다.
그럼 3.1 이라고 쓰면 무슨 의미일까?
3열로 표기하고, 소숫점 1자리의 의미로 이해하라 라는 뜻이된다.

2) 데이터가 2행 이상에 걸쳐서 입력되어 있는 경우
SAS의 입력기 창은 오른쪽으로 무한정 가지 않는다. 심지어 메모장도 영원할 것 같은데 끝이 나오더라.
그렇다면 변수가 넘어가버리면, 어쩌지?
생각해보라. 이건 심각한 문제를 만들수도 있다.
1 2 3 4 5 6 7 8 9 10 이런 값을 넣고 싶다고 치자. 물론 변수는 10개고 값이 각각 1개씩이다.
근데 줄이 모잘라서 절반만 넘어갔다.
1 2 3 4 5
6 7 8 9 10
그럼 변수는 어찌 인식할까. 나도 정확히 모르겠다. 왜냐면 6~10번째 변수부분이 없는 값에 대해 오류를 말할지 MISSING 처리할지 모르니까.
아무튼 아래 6 7 8 9 10이 1~5번째 변수의 두번째 값으로 등록되게 될 것이다.
우리가 원하는 것은 그게 아닌디...
이럴때를 위한 것이 있단다. 역시 사람의 경험은 싸이고 싸여 문제 해결을 위한 열쇠를 늘 제공하는 법이다.

DATA a1; INPUT (x1-x3) (3*2.) #2 (y1-y4) (4*6.);

a1 데이터셋이다. x1 x2 x3 변수는 각각 2열씩을 할당받는다.
2행에(#2)있는 CARDS는 y1 y2 y3 y4 변수이며 각각 6열씩 할당받는다.
이런 의미이다. 즉, 2행씩 값을 인식하고 처리하는 것이다.

또 다른 방법이다. 행이 너무나 많은 데이터라면, 각각의 행을 일일이 써주기 귀찮지 않은가. 그래서 등장했다.

DATA a1; INPUT x1 1-2 x2 3-4 x3 5-6 / y1 1-6 y2 7-12 y3 13-18 y4 19-24;
'/'가 다음 행임을 알려주는 것이다.

3) 2개 이상의 데이터를 1줄에 입력하는 경우
자유 형식의 데이터인 경우 @@를 입력하면 된다. @@는 우리가 일전에 봤다. 값을 한 줄로 주욱 때려박을때 썼던 그...것 아닌가.

DATA a1; INPUT x1 x2 x3 x4 @@; CARDS;
1 2 3 4 5 6 7 8 9 10
11 12 13 14

이는 다음과 같이 사용한 경우와 같다.

DATA a1; INPUT x1 x2 x3 x4; CARDS;
1 2 3 4
5 6 7 8
9 10 11 12
13 14

귀찮으면 편할 것 같기는 한데, 내 생각은 그렇다. 사람이 한번에 알아볼 수 없는 코딩 때문에,
배울려는 사람들이 어려움을 느끼는 건 아닐지 하고 말이다.
아래처럼 써주면 대충 감이라도 잡을텐데, 위처럼 써 놓으면...ㄱ-;
뭐 효율성의 문제니까... 넋두리당.

4) 입력변수의 갯수가 많아 변수명과 그 입력형식을 한 줄에 전부 적을 수 없을때.
참.. 점점 극으로 몰고가는 분위기이다.
하지만, 답변은 간단하다. ';' 안쓰면 두줄이건 세줄이건 한줄로 쓰는 거랑 같다. 고로....

DATA a1; INPUT (x1 x2 x3 x4)
(3. +1 3. +1 $CHAR2. +2 2.); 는

DATA a1; INPUT (x1 x2 x3 x4) (3. +1 3. +1 $CHAR2. +2 2.); 와 같다.

자 그럼 8가지 INPUT 예문을 해석해보자. 이것만 안다면 일상 업무의 95%는 문제 없단다.
(1개 틀릴때마다.. 12%씩 일상 업무의 지장을 초래하게 되는건가...ㄱ-)

① DATA A1; INPUT X1 X2 X3 $ X4;
=> A1 데이터셋; 변수는 X1에서 X4까지이며, X3은 문자열이다. 특별히 숫자가 없으므로 빈칸으로 각각의 값을 구분한다.(사실 숫자 없어서 '이거뭐야!!'하고 흠칫했다.. 이러면서 배우는거지..음핫핫)

② DATA A1; INPUT X1 1-3 X2 5-7 X3 $ 9-10 X4 13-14;
=> A1 데이터셋. 계속 A1이니 안써도 이해하시길. X1변수는 1-3열, 4열 공백, X2는 5-7열, 8열 공백, X3 문자열 변수 9-10열, 11-12열 공백, X4 변수 13-14열.

③ DATA A1; INPUT (X1 X2 X3 X4) (3. +1 3. +1 $CHAR2. +2 2.);
=> 변수는 X1~X4까지 4개. X1은 3열 사용, 공백 1칸, X2 3열 사용, 공백 1칸, X3 문자열 2열사용, 공백 2칸, X4 2열사용.

④ DATA A1; INPUT X1 X2 X3 $ X4 @@;
=> X1~X4까지 4개의 변수며 X3은 문자열 변수이다. 자료값이 1자로 주욱 들어가는데 공백을 텀으로 해서 4개씩 끊어서 값을 받아들이면 된다.

⑤ DATA A1; INPUT X1 X2 / X3 X4;
=> 변수는 X1~X4까지 4가지이며, 1행 1,2열 값은 X1 X2의 값이고, 2행 1,2열 값은 X3, X4의 값으로 2행씩 값을 받아들인다.

⑥ DATA A1; INPUT (X1 X2) (3. +1 3.) #2 (X3 X4) (+1 $CHAR2. +2 2.);
=> X1 3열, 1열 공백, X2 3열이고, 2행에 일단 공백 1번 나오고 X3 문자열 2열이고, 공백 2열 후 X4 2열이다.

⑦ DATA A1; INPUT (X1-X3) (2*2. +2 4.);
=> X1변수는 2열 사용 바로 붙여 X2변수가 2열 사용. 2열 공백. X3변수가 4열 사용.

⑧ DATA A1; INPUT @26 X1 1-3;
=> 26열부터 X1변수가 3열을 사용한다. 즉, 26, 27, 28열.

알겠는가? 저거 다 맞느냐고? 모르겠다. 같이 공부했으니 서로 틀린 것은 알지 않는가.
혹 내가 틀렸다면, 답글 달아주기를 바란다. 물론, 누가 이걸 보고 공부할지는 의문이겠지만...
같이 공부하면 좋은것 아니겠는가 음핫핫핫..
(모니터를 바라보며 혼자 이거 치면서 있는지 없는지도 모르는 사람을 향해 끄적거리는 것은 어찌보면 참 불쌍한 일이다... 게다가 아까 네이버에 SAS OBS 라고 검색했더니, SAS 독학모드 1이 검색되었다. 그저께 썼는데!! 두려워진다..)

자 이런 저런 넋두리를 뒤로하고 이제 외부 파일을 가져오고, 외부파일에 저장하는 장이 남았다.
책에서 이미지로 캡쳐되어 있는지라 좀 설명하기 그렇다. 그래도 할 수 있는 것은 아래 쓰도록 하겠다.

외부 파일 이용법 - INFILE문
이건 앞에서도 살짝 해봤다. 기억나는지 볼까?

DATA a1; INFILE 'e:\sastest\sample.dat';

기억나는가? 우리 탭으로 작성해서 프로그램 못 돌릴뻔한거 있지 않은가.
sample.dat 파일에 값을 가져와서 연산을 수행할 수 있는 것이다.
일단 간단하게 작성해서 사용해보자.
메모장을 열고 입력한다
1 2
3 4
그리고 저장해라. 저장이름은 sample1.dat이다.
♥♥♥♥♥
data a1; infile 'e:\sastest\sample1.dat';                                                                                               input x y;                                                                                                                             
x2 = x**2+y;                                                                                                                           
lx = LOG(x);                                                                                                                           
proc print; var x y x2 lx;                                                                                                             
run;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 17일 토요일 오후 04시50분27초   9

                                              OBS    x    y    x2       lx

                                               1     1    2     3    0.00000
                                               2     3    4    13    1.09861
♥♥♥♥♥
이렇게 출력된다. 값은 우리가 메모장으로 저장했던 값이 x y 변수에 들어있고, x2와 lx에 연산이 발생한 것을 볼 수 있다.

엑셀에서 가져오는 법도 나온다.
윈도우로 하는 것은 그렇다치고, 명령어로는 이렇게 된다.
개인적으로 오피스 2007을 사용중이라 책에서 말하는 엑셀2000이 없어서 결과값이 어찌될지 모른다.
고로, 책의 내용만 설명하도록 하겠다.

PROC IMPORT OUT=WORK.Aaa   .... WORK.Aaa 데이터셋을 만들겠다.
DATAFILE = "E:\sastest\sample.xls"  <- 쌍따옴표를 쓰는것과 ';'이 없음을 주의
DBMS = EXCEL2000 REPLACE;   ....엑셀 파일을 사용했다.
GETNAMES=NO; ....1행에 변수명이 없다. 보통 맨 위에 이름, 나이, ... 이런식으로 이름 붙이는 엑셀파일 많은데 가져올 파일은 그냥 데이터만 있다는 뜻이다.

FILE문과 PUT문
작업의 최종결과 또는 중간결과 데이터를 저장하는 방법이다.
우리가 아까전에 알아본 것과는 반대되는 내용이라고나 할까.
힘들다고 느낀다면 좋은 소식을 던져주겠다.
책 4장 남았다!!! 우오옹!! 좀 만 더 힘내자. 난 손까지 아프다. ㅠ_ㅠ

책 초반부에 떡하니 써 있는 한 마디.
기억해야 할 점은 "SAS 데이터셋을 외부 파일로 저장한다."는 것이다.
....기억하자.
FILE문과 PUT문은 INFILE과 INPUT문에서 IN만 뺀 것이란다. 이게 도움이 될련지 모르겠지만 음핫핫
아무튼 예시를 보자.

♥♥♥♥♥
DATA a1; INPUT x y;                                                                                                                     
CARDS;                                                                                                                                 
1 2                                                                                                                                    
3 4                                                                                                                                    
;                                                                                                                                      
DATA b1; SET a1;                                                                                                                       
xy = x + y;                                                                                                                            
FILE 'e:\sastest\kkk.dat';                                                                                                             
PUT (x y xy) (2. 3. 5.2);                                                                                                              
RUN;
♥♥♥♥♥
저장된 파일을 열어봤다. (e:\sastest\kkk.dat에 생성되었으며 메모장으로 열은 결과다)
 1  2 3.00
 3  4 7.00
음 잘 되는 것을 알 수 있다. 그것참 신기하네..

FILE문에는 파일이름, LOG, PRINT 등을 지저알 수 있으며, 자세한 건 SAS 메뉴얼을 참조하란다.
PUT문은 FILE문이 없으면 SAS log에 기록되며, 저장될때의 자리등을 지정해준다고 보면 되겠다.

자 마지막이 눈앞이다!!!

시스템 파일로 보관하기
이거 우리가 살짝 해봤다. 단지 적용된 것들을 보지 못해서 아리송할뿐...
♥♥♥♥♥
LIBNAME kkk 'e:\sastest';                                                                                                              
DATA a1; INPUT x y;                                                                                                                    
CARDS;                                                                                                                                 
1 2                                                                                                                                    
3 4                                                                                                                                    
;                                                                                                                                      
DATA kkk.b1; SET a1;                                                                                                                   
xy = x+y;                                                                                                                              
PROC PRINT; VAR x y xy;                                                                                                                
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 17일 토요일 오후 04시50분27초  10

                                                    OBS    x    y    xy

                                                     1     1    2     3
                                                     2     3    4     7
♥♥♥♥♥
활성 라이브러리에 Kkk라는 폴더와 그 안에 B1이라는 데이터셋이 만들어진 것을 확인할 수 있었다.
여기서 LIBNAME이 없으면 시스템 파일이 보관이 안된다(PC-SAS해당)

엑셀로 보관을 하는 방법도 알아봐야겠지?
윈도우로 하는 것은 나도 설명하지 않겠다. 왜냐면 오피스 2007때문에 완존히...ㄱ-
시스템을 무조건 최상으로 맞추는 것이 항상 좋은 것만은 아니다.

PROC EXPORT DATA=WORK.A1
OUTFILE = "E:\sastest\out.xls"
DBMS=EXCEL2000 REPLACE;
RUN;

이러면 결과값이 E:\sastest\out.xls 라는 이름으로 엑셀파일 저장될 것이다.
해보지를 않아서 결과값은 패스.
해 볼 수 없는 거니까 너무 아쉬워하지말고, 오피스 2000을 쓰고 있다면 하고 나에게 결과 좀 알려줬음 한다.
(나도 궁금하다. 배우는 입장인데..)

아, 한 단원 공부하는데 10시간도 넘게 걸린다. 살인적이다.
7과는 또 어찌해...ㅡㅠㅡ;
뭐 독학의 당위성이랄까... 아무튼 오늘도 즐잠. 내일은 차례지내야지 음핫핫핫;

by Joe & Soohy 2007. 2. 17. 14:56