8장이다. 제목은 SAS 프로그램 작성법...
이제 슬슬 작성에 들어가는 것인가?
음. 머리도 식힐 차원에서 SAS에 관련된 기사를 두 개 올렸다.
참 좋은 회사라고 생각한다.
국내의 여건은 어느정도인지 모르겠지만,
일단 사회에 기여하는 바가 큰 솔루션 업체가 아닌가.

아무튼, 공부를 하니 애착이 가는걸까... 열심히 공부해보자.
오늘은 15개의 세부항목으로 작성 구문을 배우게된다.
코딩이라고 생각하면 되는데, 지레 겁먹고 도망가는 바보가 있는 것은 아니겠지?
생차 초보인 나도 하는데, 같이 도망가지 말고 도전하는 시간이 되었으면 한다.

1. KEEP, DROP, RENAME 문

어제 막판에 살짝 본 것 같은데? 음... 뭔가 궁금했던 문제가 처음에 나오면 의욕이 막 생긴다.
모르면서 고민한 어제의 하루가 아스피린을 먹은 듯 씻은듯이 사라지기 때문이다.

KEEP문은 SAS 데이터셋에 들어있는 변수 중 원하는 변수만을 갖는 데이터셋을 만들때 쓰는 것이다.
형식
KEEP 변수명(데이터셋에 보관하고자 하는 변수명을 말한다);

DROP문은 반대로 원하지 않는 변수를 적으면 그것을 빼고 데이터셋을 만든다.
DROP 변수명(빼고싶은 변수명을 말한다);

즉, 다음의 문장에서

DATA a1; INPUT x1 x2 y; CARDS;
1 2 3
4 5 6
DATA b1; SET a1; KEEP x1 y;
DATA b2; SET a1; DROP x2;

b1 데이터셋과 b2 데이터셋은 동일한 변수가 들어가게 된다.
둘 모두 변수 x1, y가 들어가는 것이다. 이해가 되는가?
안된다고? 흐음
b1은 KEEP으로 x1과 y를 변수로 쓰겠다고 말하는 것이고,
b2는 DROP으로 x1, x2, y중에서 x2를 빼고 쓰겠다는 것이니 결국 x1과 y만 쓰는 것이다.

RENAME문은  변수명을 바꿀때 사용된다.
형식
RENAME 원래변수명 = 바꾸고자 하는 새로운 변수명;

어제 y가 중복될 때, y1, y2로 분리하는 것을 공부할 때 적용했던 구문이다.

♥♥♥♥♥
DATA a1; INPUT x1 x2 y; CARDS;                                                                                                          
1 2 3                                                                                                                                  
4 5 6                                                                                                                                  
DATA b1; SET a1;                                                                                                                       
RENAME x1 = nx1;                                                                                                                       
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 20일 화요일 오후 02시55분21초   2

                                                   OBS    nx1    x2    y

                                                    1      1      2    3
                                                    2      4      5    6

♥♥♥♥♥
출력되는 변수 x1이 nx1으로 변해서 나오는 것을 확인할 수 있다.


2. IF-THEN, IF-THEN/ELSE

IF, THEN, ELSE문은 어떤 상황에서는 어떤 것을 선택하겠다하는 표지판 같은 구문이다.
IF는 표지판의 글자이고, THEN은 화살표이며, ELSE는 다른 길의 방향을 가리키는 것이다.
표지판이라는 자체가 한 방향의 길에서 필요한 것이 아니지 않는가?

IF 조건 THEN 명령
만약 이런 조건 이면 명령대로 해라.

DATA a2; SET a1;
IF age < 20 THEN DELETE;
IF mon=9 THEN mon=.;

a2 데이터셋을 만들고 변수는 a1을 사용한다.
만약 age변수의 값이 20 이하라면 해당 변수를 삭제해라.
만약 mon변수의 값이 9이면 mon 변수의 값을 missing 값으로 바꾸어라.

이런 의미가 되는 것이다.
만약 age값이 20 이상이면 어쩌냐고? 아무일도 안일어나는 것이지 모..
그렇지만 상황에 따라서 아닌경우에도 어떤 명령을 내려야 할 경우가 있다.

화장실에서 휴지가 있으면 쓴다. 라는 IF문을 쓴다면,
화장지가 없으면 이 사람 어쩌라는 것인가.
그래서, 휴지가 없으면 휴지를 달라고 외쳐라. 라는 식으로 명령을 내려야 하는 경우가 필요한데,
이럴때 ELSE문을 사용하고,
여러 조건을 가정하고 싶으면(성적이 90이상이면 A, 80이상이면 B, 70이상이면 C,....이런식으로..)
ELSE IF 라는 문장을 쓰고, 마지막에 이도저도 아닐때는 이라는 의미로 ELSE라는 문장을 쓰면 된다.

DATA a1; SET a1;
IF age < 20 THEN ageg=.;
ELSE IF age <= 30 THEN ageg=1;
ELSE IF age <= 40 THEN ageg=2;
ELSE ages=3;

a1 데이터셋을 만들자. 내용은 다음과 같이 하겠고, 변수는 a1을 따른다.
만약 age 변수의 값이 20 이하이면 ageg 변수 값을 missing 처리하며,
age 변수의 값이 20 초과인데 30 이하이면 ageg 변수 값을 1로 처리하며,
age 변수의 값이 30 초과인데 40 이하이면 ageg 변수 값을 2로 처리한다.
위의 경우 어느것도 해당되지 않는 불쌍한 경우라면 ageg 변수 값을 3으로 처리하면 된다.


3. DELETE문

이름에서도 알 수 있듯이, 그리고 앞에서도 많이 사용해봤듯이 관측치를 날려버릴때 사용한다.
DROP과 헛갈리는 사람이 간혹 있는데, DROP은 자료는 두되, 해당 변수를 사용하지 않는 것이고,
DELETE는 해당 변수에 해당하는 자료를 이 세상에서 없애버리겠다는 뜻이다.

형식
IF 조건식 THEN DELETE;
만약 이런 조건이라면 날려버려라.

DATA b1; SET a1;
IF sex='m' THEN DELETE;
데이터셋 b1을 만들어보자. a1 데이터셋의 변수를 따른다;
만약 sex 변수의 값이 'm' 이라면 그 변수에 해당하는 관측치를 몽땅 제3세계로 날려버려라.


4. STOP문

STOP문은 SAS 데이터 스탭을 중지하고자 할 때 사용한다.
방대한 데이터를 처리해야 하는 경우, 일부가 돌려봐서 프로그램의 작동 상황을 확인하고,
돌리는 경우를 생각해볼 수 있다. 이게 더 효율적이기 때문이다.

DATA a1; INPUT x y z;
IF _N_ = 100 THEN STOP;
CARDS;
1 2 3
4 5 6
 .
 .
 .
301 302 303
304 305 306
;
PROC PRINT;

이렇게 프로그램을 짜면 무슨일이 생길까.
참고로, _N_ 은 관측치의 번호를 나타내는 것이라고 한다.
1번자료, 2번자료 이런식으로 데이터가 들어가지 않는가? 이 때 보이지않는 1, 2 (번째) .. 같은 숫자이다.

저렇게 연산을 돌리게 되면 자료를 아마도,
1 2 3
4 5 6
 .
 .
 .
295 296 297
요기까지만 자료가 입력될 것이다.
298 299 300 <- 요것이 100번째 자료인데, 100번째 자료면 멈추게끔 되어 있기에,
99번째 관측치 까지만 입력되는 것이다.


5. OUTPUT문

OUTPUT도 예전에 본 적이 있지 않은가? 고급 문장이라고 했었던가?
대충 이런 내용이였다.

DATA b1 b2 B3; SET a1;
IF          X=1 THEN OUTPUT b1;
ELSE IF X=2 THEN OUTPUT b2;
ELSE          THEN OUTPUT b3;

b1, b2, b3 데이터셋을 만들려고 합니다. a1이라는 데이터셋의 변수를 사용하겠습니다.
만약 변수X가 1의 값을 가지면 b1데이터셋으로 관측치를 넘기고,
만약 변수X가 2의 값을 가지면 b2데이터셋으로 관측치를 넘기며,
변수X가 위의 값에 해당하지 않는 불쌍한 상태면 관측치를 b3데이터셋으로 넘기도록 합니다.

이것을 만약 나눠서 쓰게 된다면 이렇게 되겠습니다.

DATA b1; SET a1; IF X=1;
DATA b2; SET a1; IF X=2;
DATA b3; SET a1; IF X^=1 AND X^=2;

어려운가요? 하나하나 개별로 처리했다고 생각하면 되겠는데...음
박스안에 있는 초코파이를 보는 것과 낱개로 파는 초코파이를 보는 느낌이랄까요. 흠흠.


6. DO문

DO문입니다. 정신없이 오느라 다들 뭐야 무어야!! 하고 소리지르시겠지만,
어쩝니까.. 전 아무것도 들리지 않습니다.
그리고 들어서도 안됩니다. 오늘 15까지 있는데 1/3 와서 징징대면 암울하지 않습니까.
관악산에 올라갈때, 오이를 파는 아주머니들이 계셨는데, 아래서는 싸게 팔고 올라갈수록 비싸더군요.
올라가기전에 오이를 사서 어떻게든 높은 곳에서 먹어야 돈 버는 것 아니겠습니까.
산에서 먹는 오이가 왜 그리 시원하고 맛있던지...
그렇다고 '이녀석 등산을 좋아하는구나!' 하고 생각하면 곤란합니다.
그게 6년전 일이니까요 음핫핫..ㄱ-..가고 싶어요. 근데 잘 안되네요. 뭐든 습관입니다. 진짜로...그쵸?

DO문은 반복을 위한 구문입니다.
50개의 햄버거를 먹는 프로그램을 짠다고 합시다.

햄버거 먹는 프로그램
1. 햄버거를 본다
2. 햄버거를 든다
3. 햄버거를 먹는다
4. 속이 괜찮은지 판단한다.
5. 햄버거를 본다
6. 햄버거를 든다
7. 햄버거를 먹는다
8. 속이 괜찮은지 판단한다.
9. 햄버거를 본다
10. 햄버거를 든다
11. 햄버거를 먹는다
12. 속이 괜찮은지 판단한다.
 .
 .
 .

왠지 다 쓰면 신상에 위협이 올 것 같은 생각이 듭니다.
각각 다 나열한다고 프로그램이 안돌아거는 것은 아닙니다.
하지만 궂이 저렇게 답답하게 표기해야 할까요?

이건 어떤가요?

햄버거를 먹는 프로그램
1. 50번만 반복해주세요. 반복 시작합니다.
2. 햄버거를 본다
3. 햄버거를 든다
4. 햄버거를 먹는다
5. 속이 괜찮은지 판단한다.
6. 반복횟수가 50번이 아닌지 판단하고 2번으로 돌아간다.

얼마나 간단합니까. 이런 것을 가능하게 하는 것이 DO문입니다.
'또'문 아닙니까. 또? 또 돌아? ㅎㅎㅎ

DO문은 크게 4가지로 나뉩니다.

① 단순 DO문:  END;문을 만나면 그만한다.

IF X > 5 THEN;
DO Y = X*10; LY = SQRT(Y); END;
만약 X가 5보다 크다면 아래처럼 해주세요;
Y변수에는 X에 10을 곱한 값을 넣어주시고요. LY변수에는 루트Y의 값을 구해주세요; 그리고 반복을 그만하세요;

② 반복 DO문: DO문 안에 반복을 몇 번 할것인지 정해주는 것

형식
DO 색인변수=시작 [TO 끝 [BY 증가분] [WHILE 또는 UNTIL(표현식)]];
  SAS 문장들;
END;

DO I=1 TO 10;
 SAS 문장들;
END;
SAS 문장들을 10번 반복하라.

DO I=1 BY 1;
 SAS 문장들
 IF I = 10 THEN GO TO F;
END;
F: PUT 'FINISHED';
I는 1부터 1씩 증가한다.
 SAS 문장들 실행
 만약 I가 10이되면 F로 가라
여기가 끝이다. 다시 DO문으로 돌아가라.
F는 'FINISHED'를 출력하라....가 아닐 듯 싶다.
C언어에서 PUT이란 명령어는 '  ' 안에 씌여진 글자를 그냥 출력하는 것으로 알고있다...가물가물.
아마도 그렇지 않을까 생각만 해두자. 뒤에 어디 다시 등장하겠지...;;

③ DO WHILE문
DO WHILE문은 WHILE 다음의 조건이 맞는 한 계속해서 실행된다.

형식
DO WHILE (표현식);
 SAS 문장들
END;
표현식의 내용이 맞으면 아래를 실행하고, 안 맞으면 END; 문 아래의 내용을 실행하는 것이다.

N=0;
DO WHILE (N LT 5);
 PUT N=;
 N+1;
END;
N에 0을 입력한다.
N이 5보다 작으면,
 N= 을 출력해라
 N에 1을 더해라
끝, 다시 DO WHILE문으로 가라.

④ DO UNTIL문
UNTIL문은 조건이 맞을때 실행을 중지하되, 무조건 처음 1번은 조건에 상관없이 연산한다.

WHILE문은 맞으면 통과, 틀리면 끝 인데, UNTIL문은 틀리면 통과, 맞으면 끝 이다.

형식
DO UNTIL (표현식);
 SAS 문장들;
 SAS 문장들;
END;

♥♥♥♥♥
DATA a1;
N=0;
DO UNTIL (N>=5);
 OUPUT;
 N+1;
END;
PROC PRINT;
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 20일 화요일 오후 02시55분21초   3

                                                         OBS    N

                                                          1     0
                                                          2     1
                                                          3     2
                                                          4     3
                                                          5     4
♥♥♥♥♥


7. ARRAY (배열)문

배열의 의미를 아는가? 일종의 테이블을 생각하면 이해가 빠를 것 같다.
우리가 표를 그려서 어떤 칸을 콕 찝으면 어느 위치에 있는지 알 수 있지 않는가.
배열은 여러 변수들에 어떤 동일한 명령을 적용시킬때 등에 사용된다.
말로 써봐야 잘 이해 안된다.
역시 형식 설명 후 예제를 보도록 하자.

형식
ARRAY array명[{n}] [$] [length] [변수들 이름];
배열 배열이름을 정한다[{변수의 수}] [$<- 문자열이면 붙이는건가?] [길이??] [변수들 이름??]

ARRAY aaa{7} X1-X5 GNP MONEY;
DO I=1 TO 7; IF aaa{I}=9 THEN aaa{I}=.; END;
배열 배열 aaa는 7개의 변수를 가진다. X1 X2 X3 X4 X5 GNP MONEY가 그것이다.
I가 1에서 시작해서 7까지 반복한다.(7번 반복하겠다는 의미); 만약 배열 aaa(I)의 변수값이 9이면 .으로 바꾼다; 끝내고 다시 DO문으로 돌아가자;

ARRAY aaa X1-X5 GNP MONEY;
DO OVER aaa; IF aaa= 9 THEN aaa=. ; END;
aaa란 배열에는 X1 X2 X3 X4 X5 GNP MONEY라는 변수가 포함된다.
OVER가 뭐지;; 아무튼 같은 내용이다. 변수의 숫자를 쓰지 않았을 뿐...
이렇게 썼을때 실행이 되지 않는 경우가 발생할 수 있단다. 그럴때는

ARRAY aaa(*) X1-X5 GNP MONEY;
DO I=1 TO DIM(aaa); IF aaa{I} = 9 THEN aaa{I}=.; END;
이렇게 쓰면 되는데 (*)를 쓰면 알아서 세어준다. DIM 함수는 배열문의 변수의 개수를 구하는 기능이 있어서 이번 경우 DIM(aaa)=7 이 나오게 된단다.

ARRAY가 위에서 본 1차원 배열(변수가 1자로 주욱 있는 것)만 적용되는 것은 아니다.
다차원 배열이 +_+ 가능하다.

ARRAY TEST{2,3} TEST1-TEST6;
요렇게 TEST라는 이름의 배열 옆에 (2행 3열)이라고 표기를 해주면
실제로 변수는 이런 위치를 보인다.

TEST1  TEST2  TEST3
TEST4  TEST5  TEST6

알겠는가? 예문을 보고 이해해보도록 하자.
♥♥♥♥♥
DATA a1; INPUT year korea japan usa ec; /* a1 데이터셋을 만들어라; 변수는 year korea japan usa ec 이다. */                             
CARDS; /* 데이터들 */                                                                                                                  
1981 12 34 56 78                                                                                                                       
1982 16 47 66 82                                                                                                                       
1983 32 13 32 13                                                                                                                       
1984 20 14 69 20                                                                                                                       
1985 30 20 10  1                                                                                                                       
1986 11 22 33 44                                                                                                                       
1987 43 32 21 10                                                                                                                       
1988 92 38 42 84                                                                                                                       
1989 30 20 30 30                                                                                                                       
1990 93 125 262 301                                                                                                                    
;                                                                                                                                      
DATA a1; SET a1; /* 데이터셋 a1은 a1 데이터셋의 변수를 사용한다 */                                                                     
ARRAY xxx(4) korea japan usa ec; /* 배열 xxx는 4개의 변수를 가진다 : korea japan usa ec */                                             
ARRAY yyy(4) rkorea rjapan rusa rec; /* 배열 yyy는 4개의 변수를 가진다 : rkorea rjapan rusa rec */                                     
DO i=1 to 4; /* i는 1에서 4까지 1씩 증가하며 DO 내의 문장을 4번 반복한다 */                                                            
yyy{i} = ( xxx{I} - LAG(xxx{i}) ) / LAG(xxx{i}); /* 배열 yyy{i}에 들어가는 변수값 연산 */                                              
END; /* DO문 여기까지 다시 반복할 것 */                                                                                                
PROC PRINT; VAR rkorea rjapan rusa rec; /* 출력할 것. 변수 rkorea rjapan rusa rec에 대해서 */                                          
RUN; /* 돌려돌려 */
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 20일 화요일 오후 02시55분21초   4

                                    OBS     rkorea      rjapan       rusa           rec

                                      1      .           .           .            .
                                      2     0.33333     0.38235     0.17857      0.0513
                                      3     1.00000    -0.72340    -0.51515     -0.8415
                                      4    -0.37500     0.07692     1.15625      0.5385
                                      5     0.50000     0.42857    -0.85507     -0.9500
                                      6    -0.63333     0.10000     2.30000     43.0000
                                      7     2.90909     0.45455    -0.36364     -0.7727
                                      8     1.13953     0.18750     1.00000      7.4000
                                      9    -0.67391    -0.47368    -0.28571     -0.6429
                                     10     2.10000     5.25000     7.73333      9.0333

♥♥♥♥♥
LAG 함수가 또 발목을 붙잡는다.
그래서 LAG함수를 알아보도록 하자.
책에 나온 설명은 다음과 같다.

SAS에서는 두 변수의 합과 차이는 쉽게 구할 수 있다. 그러나 현재의 관츨치와 이전의 관측치의 합이나 차이는 쉽게 구할 수 없다. 바로 앞의 자료를 구하는 것이 LAG() 함수이다. LAG(X) 하면 변수 X의 바로 이전 자료를 구하고, LAG2(x)하면 두 번째 앞의 자료를 구할 수 있다.

그렇다고쳐도 대체 뭘 구하려는 작정인지 모르겠다. 저녁먹고 다시 해야겠당.

아 맛나게 저녁을 먹고 다시 시작!
컴퓨터를 키고, 다시 저 결과값을 바라보니 무슨 말인지 이해가 간다.
결과값의 2행의 0.33333은 어떻게 나온 값인고 하니,
(16-12) /12 -> 0.33333 이란 값이 되는 것이다. 즉, 1981년에서 1982년으로 가는동안 0.33333 만큼 증가했다는 것이다. 즉 33.3% 증가라는 말이다.


8. TITLE문과 FOOTNOTE문

일전에 우리가 봤던 구문들이다.
전자는 출력 윗부분에 프린트 하는 기능이고, 후자는 아랫부분에 프린트하는 기능이다.
10줄까지 만들 수 있으며, 최대 132자의 문자를 넣을 수 있다.

형식
TITLE[N] ['TITLE']

TITLE 'FIRST LINE';
TITLE2 'SECOND LINE';
TITLE10 'THIRD LINE';

그냥 봐도 딱 알 것 같다. 한 가지 유의할점이 있다면..

PROC PRINT;
RUN;
TITLE 'TITLE FOR SECOND PROC';
PROC MEANS;


PROC PRINT;
PROC MEANS;
TITLE 'TITLE FOR SECOND PROC';
는 같게 출력되지만,

PROC PRINT;
TITLE 'TITLE FOR SECOND PROC';
PROC MEANS;
는 다르게 출력된다.

위의 두가지는 아래 MEANS만 출력되고,
아래는 PRINT, MEANS 둘 모두에 출력된다.

첫 번째 문장에서 MEANS만 출력되는 이유는 PROC PRINT; RUN;이 실행되어 PRINT가 끝나버려서 그렇고,
두 번째는 MEANS 구문 아래 있기 때문에 위하고는 상관 없어지는 것이다.

FOOTNOTE문도 TITLE과 같다.
형식
FOOTNOTE[N] ['TEXT'];

궂이 예시를 안들어도 이해하리라 본다.


9. LABEL문

이번 명령어도 일전에 우리가 한 번 만났지 않았나 싶다.
변수명에 특정 이름을 주고자 할 때 사용된다.

형식
LABEL variable='label';

여기서,
variable: Label을 지정하고자 하는 변수명
label: 빈칸을 포함하여 256자까지 가능하며 인용부호가 앞뒤에 있어야 함
라벨 자체에 인용부호가 있는 경우에는 이렇게 바꿔쓰면 된다.

LABEL n='mary''s experiment number';

♥♥♥♥♥
DATA a1;                                                                                                                               
INPUT sex $ mar age edu his work pay money hob @@;                                                                                     
CARDS;                                                                                                                                 
M 1 18 2 1 4 5 42 1  F 1 19 2 1 5 5 42 3                                                                                               
F 1 20 3 1 4 5 43 2  F 1 21 3 2 3 4 45 7                                                                                               
F 1 22 3 2 4 4 45 3  F 1 23 3 3 2 3 47 5                                                                                               
F 1 24 3 3 1 2 49 5  F 1 25 4 3 2 2 50 1                                                                                               
;                                                                                                                                      
PROC PRINT; VAR sex edu hob work pay money;                                                                                            
RUN;                                                                                                                                   
DATA b1; SET a1;                                                                                                                       
LABEL sex="성별"                                                                                                                       
      mar="결혼유무"                                                                                                                   
      edu="교육수준"                                                                                                                   
      hob="취미생활";                                                                                                                  
PROC PRINT LABEL; VAR sex edu hob work pay money;                                                                                      
RUN;

♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시06분31초   1

                                     OBS    sex    edu    hob    work    pay    money

                                      1      M      2      1       4      5       42
                                      2      F      2      3       5      5       42
                                      3      F      3      2       4      5       43
                                      4      F      3      7       3      4       45
                                      5      F      3      3       4      4       45
                                      6      F      3      5       2      3       47
                                      7      F      3      5       1      2       49
                                      8      F      4      1       2      2       50

                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시06분31초   2

                                OBS    성별    교육수준    취미생활    work    pay    money

                                 1      M          2           1         4      5       42
                                 2      F          2           3         5      5       42
                                 3      F          3           2         4      5       43
                                 4      F          3           7         3      4       45
                                 5      F          3           3         4      4       45
                                 6      F          3           5         2      3       47
                                 7      F          3           5         1      2       49
                                 8      F          4           1         2      2       50

♥♥♥♥♥
결과 값은 같지만, LABEL문을 이용해서 변수명의 출력을 바꿔준 것을 볼 수 있다.
변수가 바뀐것이 아니다. 단지 출력할 때 그렇게 보여주겠다는 것이다.


10. FORMAT문

10번째 구문이다. 기억하는지 모르겠지만, 예전에 LABEL문이 나왔을 때, 위쪽 카테고리 말고, 왼쪽에도 한글로 표기시킬 수 있으면 좋겠다고 했던거 기억할련지.
FORMAT문이 그 구문이라고 한다. +_+
일단은 형식과 예문을 보도록 하자.

형식
FORMAT 변수명 [양식명] 변수명 [양식명];

여기서,
변수명: 특정이름을 지정하고자 하는 변수명
양식명: 변수의 값에 따라 프린트하고자 하는 양식(FORMAT)

PROC FORMAT;
VALUE fmtaaa M='남자' F='여자';
PROC PRINT; VAR sex; FORMAT sex fmtaaa. ;
PROC FREQ; TABLES sex; FORMAT sex fmtaaa;

FORMAT문을 사용하겠다.
fmtaaa는 M을 남자로, F를 여자로 표기한다.
출력하겠다. sex라는 변수를 말이다. 이때 sex에 fmtaaa를 적용하겠다.
FREQ(도수분포던가??)를 적용하겠다; sex 테이블에 대해서 말이다. 이때 역시 sex에 fmtaaa를 적용하겠다.

대체 이게 뭔 소리지..ㅡ.ㅡ;
리얼스러운 예문을 보도록 하자.

♥♥♥♥♥
DATA a1;                                                                                                                               
INPUT sex $ mar age edu his work pay money hob @@;                                                                                     
CARDS;                                                                                                                                 
M 1 18 2 1 4 5 42000 1  F 1 19 2 1 5 5 42000 3                                                                                         
F 1 20 3 1 4 5 43000 2  F 1 21 3 2 3 4 45000 7                                                                                         
F 1 22 3 2 4 4 45000 3  F 1 23 3 3 2 3 47000 5                                                                                         
F 1 24 3 3 1 2 49000 5  F 1 25 4 3 2 2 50000 1                                                                                         
DATA b1; SET a1;                                                                                                                       
LABEL sex="성별" mar="결혼유무" edu="교육수준" hob="취미생활";                                                                         
PROC FORMAT;                                                                                                                           
VALUE $kkk 'F'='여자' 'M'='남자' 'A'-'C'='잘못';                                                                                       
VALUE bbb low-44999 = '저임금' 45000-48999 = '정상임금' 49000-high = '고임금' OTHER = '잘못 입력';                                     
PROC PRINT; VAR sex edu hob work pay money;                                                                                            
FORMAT pay comma7.3 money bbb. sex $kkk.;                                                                                              
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시06분31초   3

                                 OBS    sex     edu    hob    work        pay     money

                                  1     남자     2      1       4       5.000    저임금
                                  2     여자     2      3       5       5.000    저임금
                                  3     여자     3      2       4       5.000    저임금
                                  4     여자     3      7       3       4.000    정상임금
                                  5     여자     3      3       4       4.000    정상임금
                                  6     여자     3      5       2       3.000    정상임금
                                  7     여자     3      5       1       2.000    고임금
                                  8     여자     4      1       2       2.000    고임금

♥♥♥♥♥
어라 왜 라벨문이 출력을 안하지? 해서 보니..
PROC PRINT; VAR sex edu hob wwork pay가 아니라
PROC PRINT LABEL; VAR sex edu hob wwork pay을 해야했다.


                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시40분28초   3

                            OBS    성별    교육수준    취미생활    work        pay     money

                             1     남자        2           1         4       5.000    저임금
                             2     여자        2           3         5       5.000    저임금
                             3     여자        3           2         4       5.000    저임금
                             4     여자        3           7         3       4.000    정상임금
                             5     여자        3           3         4       4.000    정상임금
                             6     여자        3           5         2       3.000    정상임금
                             7     여자        3           5         1       2.000    고임금
                             8     여자        4           1         2       2.000    고임금

이러니까 결과가 제대로 나온다.. 역시


11. INFORMAT문

FORMAT문과 이름이 살짝 다르다.
이건 뭐에 쓰는 것일까...
FORMAT문은 프린트하는 양식을 지정하는 것이였다.
INFORMAT은 입력에 대한 양식을 지정한다.
예문을 보면 이해가 빠를 것이다.

DATA b1; INPUT x y z;
CARDS;
1jan90 34 123
2mar93 26 190
PROC PRINT;
RUN;

DATA b1;
INFORMAT x DATE7. ;
INPUT x y z;
CARDS;
1jan90 34 123
2mar93 26 190
PROC PRINT;
RUN;

위와 아래의 차이를 알겠는가?
빨간 부분이 추가되었자나! 라는 건 누구라도 다안다.
안그래도 빨개서 눈에 띌텐데...
INFORMAT x DATE7. 의 의미가 무엇인고 하면,
변수 x의 양식이 날짜형 7자리라는 것이다.
한번 돌려보도록 하자.

                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시40분28초   4

                                                 OBS      x       y     z

                                                  1     10958    34    123
                                                  2     12114    26    190

x값이...참....ㄱ-
아마도 1900년 1월 1일을 기점으로 몇일 지났는가가 아닐까 싶다.
엑셀도 보통 그렇게 되어 있으니까 말이다.
날짜형인지 모른다면 에러가 낫을지도 모르겠다. 우리가 문자열 기호를 쓰지 않았기 때문에, 문자열을 이상하게 생각할 수도 있기 때문이다.


12. RETAIN문

RETAIN의 사전적 의미는 보유하다, 존속하다의 의미이다.
SAS의 중급 수준 이상의 기법인 이 구문은 특히 누적치를 구할때 유용하게 사용된다고 한다.

♥♥♥♥♥
DATA a1; INPUT X @@; CARDS;                                                                                                            
1 2 3 4 5                                                                                                                              
DATA a1; SET a1;                                                                                                                       
RETAIN sumx 0;                                                                                                                         
sumx = sumx + x;                                                                                                                       
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시40분28초   5

                                                     OBS    X    sumx

                                                      1     1      1
                                                      2     2      3
                                                      3     3      6
                                                      4     4     10
                                                      5     5     15
♥♥♥♥♥
sumx 변수가 X값을 누적해서 취하는 것을 알 수 있다.

다른 예제를 보도록 하자.
♥♥♥♥♥
DATA a1; INPUT group x y; CARDS;                                                                                                       
1 11 10                                                                                                                                
1 21 20                                                                                                                                
1 31 30                                                                                                                                
1 41 40                                                                                                                                
2 50 50                                                                                                                                
2 100 101                                                                                                                              
3 200 201                                                                                                                              
DATA b1; SET a1;                                                                                                                       
sumx+x;                                                                                                                                
sumy+y;                                                                                                                                
PROC PRINT;                                                                                                                            
DATA b2; SET a1;                                                                                                                       
RETAIN sumx sumy 0;                                                                                                                    
sumx = sumx + x;                                                                                                                       
sumy = sumy + y;                                                                                                                       
PROC PRINT;                                                                                                                            
DATA b3; SET a1;                                                                                                                       
RETAIN gg sumx sumy 0;                                                                                                                 
IF gg ^= group THEN DO; sumx=0; sumy=0; END;                                                                                           
/* IF group = LAG(group) THEN DO; . ; END; */                                                                                          
sumx = sumx + x;                                                                                                                       
sumy = sumy + y;                                                                                                                       
gg = group;                                                                                                                            
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시40분28초   6

                                        OBS    group     x      y     sumx    sumy

                                         1       1       11     10      11      10
                                         2       1       21     20      32      30
                                         3       1       31     30      63      60
                                         4       1       41     40     104     100
                                         5       2       50     50     154     150
                                         6       2      100    101     254     251
                                         7       3      200    201     454     452

                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시40분28초   7

                                        OBS    group     x      y     sumx    sumy

                                         1       1       11     10      11      10
                                         2       1       21     20      32      30
                                         3       1       31     30      63      60
                                         4       1       41     40     104     100
                                         5       2       50     50     154     150
                                         6       2      100    101     254     251
                                         7       3      200    201     454     452

                                                        SAS 시스템            2007년 02월 20일 화요일 오후 08시40분28초   8

                                     OBS    group     x      y     gg    sumx    sumy

                                      1       1       11     10     1      11      10
                                      2       1       21     20     1      32      30
                                      3       1       31     30     1      63      60
                                      4       1       41     40     1     104     100
                                      5       2       50     50     2      50      50
                                      6       2      100    101     2     150     151
                                      7       3      200    201     3     200     201

♥♥♥♥♥
이게 대체 뭘까.. 한 번 보도록 하자.
a1 데이터셋을 만들자. 입력 변수는 group x y 3개이며, 데이터들은 다음과 같다.
(데이터 중략)
b1 데이터셋을 만들자. 입력 변수는 a1과 같다.
sumx에 변수 x의 값을 더해라
sumy에 변수 y의 값을 더해라
출력해라 ( REMAIN을 사용하지 않고 sumx와 sumy 연산을 보는 것 같음)

b2 데이터셋을 만들자. 입력 변수는 a1과 같다.
(RETAIN 함수를 사용하여) sumx sumy 초기값은 0이다.
sumx = sumx + x이다
sumy = sumy + y이다
출력해라. (REMAIN문을 사용하여 sumx와 sumy의 연산을 봄 .. 근데 결과값이 같아 보이는데;;)

b3 데이터셋을 만들자. 입력변수는 a1과 같다.
(RETAIN 함수를 사용하여) gg sumx sumy 변수 초기값은 0이다.
변수 GROUP의 값과 바로 앞 관측치의 변수 GROUP의 값 'GG'를 비교하여
서로 다른경우, 즉 새로운 그룹인 경우 sumx sumy를 0으로 지정한다.  ....이해가 잘 안된다..
sumx = sumx+x이다.
sumy = sumy+y이다.
gg는 group변수의 값이다.
출력해라. 돌려돌려.

이거 솔직히 RETAIN문이 잘 이해가 되지 않는다. 나중에 다시 봐야 할 듯 싶다.


13. MISSING문

입력 데이터 중 숫자형 변수인 경우 특수문자를 Missing 데이터로 간주하고자 하는 경우에 사용한다.
즉, 숫자 넣어야 하는데, 특수한 문자가 영어로 들어가있다면 해당 영어를 '.'으로 바꾸어 버리는 것 같다.

형식
MISSING values;

DATA a1;
MISSING a r;
INPUT id answer;
CARDS;
1001 2
1002 r
1003 1
1004 a
1005 2

입력 데이터에 있는 a, r의 값을 MISSING 처리한다.
그렇다면 MISSING문이 없다면 어찌되는 걸까?
그럴경우 유요하지 않은 데이터로 간주되어버린다.


14. LIST문

SAS log에 입력된 자료를 프린트하고자 하는 경우에 사용한다.

형식
LIST;

뭐야 이게 다야;;;;

DATA a1; INPUT ssn 1-9 #3 w2amt 1-6;
IF w2amt=. THEN LIST;
CARDS;
123456789
hong gildong
356.79
345671234
kim changho
.
;
뭔지 잘 모르겠다. 그냥 list라고 함 쳐볼까...
오류뜬다.. 대체뭐지. 저 문장 실행해도 안되는데...
더 공부를 해야 할 것 같다.


15. OPTION문

SAS 시스템의 DEFAULT 값을 잠정적으로 변환하고자 할 때 사용한다.

형식
OPTIONS OPTON ...;

이건 알 것 같다. 몇몇 옵션들을 거론하면 아마도 기억이 새록새록 피어오를것이다.

FIRST OBS : 데이터셋을 만들 때 몇 번째 자료부터 이용할 것인지 지정.
OBS : 데이터셋에 몇 개의 관측치를 이용할 것인가를 지정.
DATE : SAS 상단에 날짜를 프린트 할 것인가, 하지 않을 것인가를 지정.
NODATE : SAS 결과 상단에 날짜가 프린트 되지 않는다.
LINESIZE=: SAS 결과를 구할 때 결과의 폭을 지정한다.
MISSING=:  MISSING으로 처리하고자 하는 값을 지정.
PAGESIZE=: SAS 결과를 구할 때 한 페이지에 몇 행을 프린트 할 것인가를 지정.

대충 기억이 나는가? 아마도 MISSING 빼고는 4장 배울때쯤에 구경했던 것 같은데...
뒤돌아보는 습관 중요하다.
요새 맨날 이거 파느라, 뒤를 못 돌아봐서 큰일이다.
진도를 빼는 것이 가장 중요한 것이라고 생각하면 안되지만서도, 개강이 다가오니 그게 쉽지많은 않다.
아무튼 오늘 하루도 이렇게 끝냈다.
부족한 것은 또 공부하게 될 일이 있을 것이다.
내일은 또 무엇이 기다리고 있을까...

by Joe & Soohy 2007. 2. 20. 15:54