자 설날도 어느덧 막바지에 이르는 지금...
오늘은 7장이다.
가장 중요하다는 DATA, PROC문을 전에 공부했었는데, 오늘은 두번째로 중요한 것이란다.
뭐가 중요한지 어디 구경해보자.

7장의 책 제목은 데이터셋 활용하기이다.
서두에서 얘기하는 것을 보자면 MERGE문, UPDATE문, SET문을 알면 외부 데이터와 연계해서 작업을 처리하는 것이 한층 수월해질 것이라고 한다.
데이터를 따로 활용할 수 있는 것은 중요하다.
뭐 생각하기에 따라서는 SAS 프로그램상에 상주시켜서 계속 쓰면 되지 않느냐 하는 게으른(?) 사람도 있을텐데,
캠코더에서 테이프를 빼지않고 맨날 꽂아서 쓰는 사람이 있을까?
자료와 정보의 활용이라는 것은 누적되면서 가치를 일으키는 것이 많다.
네이버의 지식인을 보라. 변화가 적은 학문일수록, 지식을 찾기 쉬워지고, 공유하기 편해진다.
당장 필요하지 않아도, 필요할 수 있는 자료들은 따로 저장을 해야하고,
이럴때 외부로 자료를 정돈하여 저장하고, 필요시에 꺼내쓸 수 있다면 참 좋을 것이다.

일단 예제문을 보면서 생각해보도록 하자.

♥♥♥♥♥
DATA a1; INPUT x1-x3; CARDS;                                                                                                            12 34 26                                                                                                                               
22 24 37                                                                                                                               
16 23 55                                                                                                                               
PROC PRINT;                                                                                                                            
DATA a2; SET a1;                                                                                                                       
y = (x1+x2)/2;                                                                                                                         
PROC PRINT;                                                                                                                            
PROC MEANS DATA=1;                                                                                                                     
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 04시30분21초   1

                                                   OBS    x1    x2    x3

                                                    1     12    34    26
                                                    2     22    24    37
                                                    3     16    23    55

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 04시30분21초   2

                                               OBS    x1    x2    x3      y

                                                1     12    34    26    23.0
                                                2     22    24    37    23.0
                                                3     16    23    55    19.5
♥♥♥♥♥
a1 데이터셋을 만든다; 변수는 x1-x3까지 이며; 자료의 내용은 다음과 같다.
12 34 26
22 24 37
16 23 55
데이터셋 a1에 입력된 내용을 출력하자.
a2 데이터셋을 만든다; 변수는 a1 데이터셋과 동일하다;
y = (x1+x2)/2 이다;
데이터셋 a2에 입력된 내용을 출력하자;
데이터셋 a1에 대한 평균값을 구한다.(뒤에 DATA=a1으로 지정해주었기 때문에..a2데이터셋이 아닌것이다)

그렇다면, 지우고 하는 것과 무슨 차이가 있길래? 하는 생각이 들지 않는가? 나만 그런가?
그래서 +_+ 한 번 해보고자 한다.

DATA a1; INPUT x1-x3; CARDS;                                                                                                            12 34 26                                                                                                                               
22 24 37                                                                                                                               
16 23 55                                                                                                                               
PROC PRINT;                                                                                                                            
DATA a2; SET a1;                                                                                                                       
y = (x1+x2)/2;                                                                                                                         
PROC PRINT;                                                                                                                            
PROC MEANS;                                                                                                                            
RUN;

내용을 살짝 바꾸고...

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 04시30분21초   5

                                                      MEANS 프로시저

                         변수    N          평균값        표준편차          최소값          최대값
                         -------------------------------------------------------------------------
                         x1      3      16.6666667       5.0332230      12.0000000      22.0000000
                         x2      3      27.0000000       6.0827625      23.0000000      34.0000000
                         x3      3      39.3333333      14.6401275      26.0000000      55.0000000
                         y       3      21.8333333       2.0207259      19.5000000      23.0000000
                         -------------------------------------------------------------------------
이게 추가되었다. 뭐지?
ㄱ- 아니 똑같다.. 저걸 아까 붙여넣기 안한건가....ㄷㄷㄷ
무슨 차이일까... 대체....아직 이해하기에 내공 부족이다.
부족한 것을 안다고 한다면, 같이 공부하는 사람들이 허탈해할까싶어, 페이스대로 공부공부.
다시해보니 처음 값도 틀리게나온다.
데이터셋이 남아서 연산이 겹쳐버리는건지 원... 아 잊어버려~ 잊어버려~~

난 학과에서 DATABASE 과목을 들어본적이 있다.
다 기억나지는 않지만, 업무에 따른 객채를 잘 정해야 원할한 프로그램이 나온다.
빵집에서는 밀가루가 중요하지 필통이 중요하지 않은 논리다.
필요한 데이터를 필요한 것으로 추출하는 것은, 자료를 활용하는데 있어서 결정적이다.

SAS는 자료를 효율적으로 활용하게끔 도와주는 소프트웨어지만,
결국 사용하는 것은 사람이다.
우리가 어떤 일에 소프트웨어를 사용해야 할지는, 결국 사용자가 생각해서 정해야 한다.
자료를 추출하는 것도 그렇다.
어디에 어떤 자료가 쓰일지 사람이 정해줘야 한다.
....그렇다면, 자료를 어떻게 뽑을것인가? 하는 문제가 생긴다. 그렇지 않은가?
이를 위해서 책은 뭐라고 얘기하는지 들어보도록 하자.

♥♥♥♥♥
DATA a1; INPUT sex $ 1 WEIGHT 3-6 HEIGHT 8-10;                                                                                                 
CARDS;                                                                                                                                         
F 56.3 167                                                                                                                                     
F 45.6 156                                                                                                                                     
M 76.2 176                                                                                                                                     
F 45.9 176                                                                                                                                     
M 76.2 176                                                                                                                                     
;                                                                                                                                              
DATA a2; SET a1; IF sex = 'M';                                                                                                                 
PROC MEANS;                                                                                                                                    
RUN;

♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 04시50분26초   3

                                                      MEANS 프로시저

                        변수      N          평균값        표준편차          최소값          최대값
                        ---------------------------------------------------------------------------
                        WEIGHT    2      76.2000000               0      76.2000000      76.2000000
                        HEIGHT    2     176.0000000               0     176.0000000     176.0000000
                        ---------------------------------------------------------------------------
♥♥♥♥♥
a1이라는 데이터셋을 만들어라. 입력값은 변수sex는 문자열 1열을 쓰며, WEIGHT는 3-6열 숫자열, HEIGHT 8-10열 숫자열을 쓴다.
데이터값들;
F 56.3 167                                                                                                                                     
F 45.6 156                                                                                                                                     
M 76.2 176                                                                                                                                     
F 45.9 176                                                                                                                                     
M 76.2 176
데이터끝;
a2 데이터셋을 만들어라. a1 데이터셋의 값을 사용한다. 만약 sex가 'M'인 경우;
평균값을 구해라.
돌려돌려;

그래서 M일 경우만, 나머지 변수인 WEIGHT와 HEIGHT의 평균값이 나오게 된 것이다.
조건을 뽑아 내는것이 어려운가?
IF문이 나오면 아래 그 조건에 해당하는 연산이 이루어지는 것은 당연한 수순이다.
만약 M이 아니라 F도 따로 계산하고 싶다면
ELSE라는 문장으로 다음이 추가되지 않을까 싶다.
사실 프로그램이라는 것은 거의 비슷한 룰을 이룬다. 일반사용자가 프로그램에 벽을 느끼면서 스트레스를 받듯이,
프로그래머도 완전히 다른 시스템들로만 세상의 모든 프로그램이 이루어진다면 스트레스에 죽어버리지 않을까?
그리고, 한 프로그램의 시장이 무너져서 다른 프로그램을 공부해야 할때,
완전히 다른 시스템이라면 시장 자체의 경쟁력이 추락하게 될 수도 있다.
아무튼, 이러저러한 이유로, 약간의 독창성에 대한 것이 아니라면, 궂이 다르게 만들지는 않는다.

뒷 부분을 다르게 작성하는 법이 적혀있다.
어제 배운 비교 연산자를 생각하면 이해가 빠를 것 같다^^

DATA a2; SET a1;
IF sex='M' THEN OUTPUT;
PROC MEANS; RUN;

a2 데이터셋을 만들고, 자료는 a1의 변수를 활용한다.
만약 sex 변수의 값이 M이라면 결과를 내겠다;
평균값을 구해라; 돌려돌려;

같은 의미 아닌가? 또 다른 방법도 소개되고 있다.

DATA a2; SET a1;
IF sex ^= 'M' THEN DELETE;
PROC MEANS; RUN;

조금 극단적인 기분이 들지 않는가? DELETE... 저번에 배워서 공감하겠지만, 자료를 지우는 것은 상당히 위험한 일이다. 다른 변수에서 또 얼마나 중요한 결과값들이 기다리고 있을지 모르기 때문이다.

a2 데이터셋을 만들고, 자료는 a1의 변수를 활용한다.
sex 변수의 값이 M이 아니면 지워라;
평균값을 내라; 돌려돌려;

다음 배워볼 것은 SET문이다.
자료를 합치는데 쓰이는 문장이다.

DATA all; SET a1 a2;    ....데이터셋 a1과 a2를 아래위로 합쳐라.

DATA kkk; SET all; IF reg=1;   .... 데이터셋 all 중에서; reg가 1인 경우 kkk로 보내라.

DATA all; MERGE a1 a2; BY reg;   .... 데이터셋 a1과 a2를 reg로 옆으로 합친다.

갑자기 MERGE까지 나오네...ㄷㄷㄷ

형식은 아래와 같다.
DATA 새로운 데이터셋이름; SET 기존 데이터셋 이름(들); 자료변환 등 SAS 프로그램 문장들

예제를 보도록 하자.
♥♥♥♥♥
DATA a1; INPUT x y; CARDS;                                                                                                                     
1 21                                                                                                                                           
2 56                                                                                                                                           
DATA a2; INPUT x y z; CARDS;                                                                                                                   
1 33 11                                                                                                                                        
2 56 21                                                                                                                                        
DATA all; SET a1 a2;                                                                                                                           
PROC PRINT;                                                                                                                                    
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 04시50분26초   4

                                                   OBS    x     y     z

                                                    1     1    21     .
                                                    2     2    56     .
                                                    3     1    33    11
                                                    4     2    56    21
♥♥♥♥♥
데이터가 합친 것을 알 수 있다.
중요하게 볼 부분은 2번째와 4번째 행 부분이다.
SET문은 데이터를 위 아래로 합치는 것은 알고 있다.
하지만 2번째와 4번째 행은 x와 y의 값이 같다.
값이 동일 할 경우 같은 데이터라고 처리하는 것이 아니라,
독립적으로 처리되는 것을 이해해야 할 것이다.
없는 값들은 '.'(MISSING) 처리 되었음을 볼 수 있다.

♥♥♥♥♥
DATA a1; INPUT id x1 x2; CARDS;                                                                                                                
1 33 44                                                                                                                                        
2 32 34                                                                                                                                        
1 22 44                                                                                                                                        
1 32 67                                                                                                                                        
2 11 34                                                                                                                                        
;                                                                                                                                              
PROC SORT; BY id;                                                                                                                              
DATA b1; SET a1; BY id;                                                                                                                        
IF FIRST.id = 1;                                                                                                                               
PROC PRINT;                                                                                                                                    
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 04시50분26초   5

                                                   OBS    id    x1    x2

                                                    1      1    33    44
                                                    2      2    32    34

♥♥♥♥♥
a1 데이터셋을 만들어라. 입력값은 변수id x1 x2이다.
자료값들은 다음과 같다;
1 33 44                                                                                                                                        
2 32 34                                                                                                                                        
1 22 44                                                                                                                                        
1 32 67                                                                                                                                        
2 11 34                                                                                                                                        
자료끝;
정렬해라(SORT). id 를 기준으로 말이다;
b1 데이터셋을 만들어라. 입력값은 a1과 같이 한다. id순으로 말이다.
만약 첫 id 값이 1이면 (이게 가장 헛갈리는데, 우리가 보이지 않게 테이블안에 시작값과 끝값이 있다고 한다 변수가 HI라면 HI로 정렬되는 첫 값은 FIRST.HI 값이 1이고, 마지막 HI로 정렬되는 값은 LAST.HI 값이 1이 나온다. 이건 우리가 보는 값이 아닌, 자료 처리를 편하게 하기 위해서 숨겨진 값이니 알고만 있자;)
출력해라;
돌려돌려;

테이블로 나온 내용이 있으니 한번 적어보겠다.
WORK.b1 값의 변화이다.

id   x1   x2   |  first.id    last.id
1    33   44          1           0
1    22   44          0           0
1    32   67          0           1
2    32   34          1           0
2    11   34          0           1
id로 정렬 했을때의 결과이고 오른쪽의 first.id와 last.id 값은 보이지 않는 값이다.

id   x1   x2   |  first.id    last.id
1    33   44          1           0
2    32   34          1           0
first.id값이 1인 값만 추출한 것이다.
그래서 위에 결과값이 그렇게 나온것이다.
그렇다면 last.id로 정렬하면 어찌 될까?

id   x1   x2   |  first.id    last.id
1    32   67          0           1
2    11   34          0           1
요렇게 나오게 될 것이다.
신기하지 않은가? 이어서는 밥 먹고와서 하도록 하겠다.
살짝 졸리네... 식곤오면 큰일인디....

졸리긴 졸리다. 무슨 밥 먹고 정신 차리니 3시간이나 지나는거지..
논것도 아닌데 그것 참...

♥♥♥♥♥
DATA a1; INPUT code1 x y; CARDS;                                                                                                       
1 11 21                                                                                                                                
3 22 56                                                                                                                                
PROC SORT; BY code1;                                                                                                                   
DATA a2; INPUT code1 x y z; CARDS;                                                                                                     
2 33 11 5                                                                                                                              
5 56 21 6                                                                                                                              
3 45  6 7                                                                                                                              
7 76 43 7                                                                                                                              
PROC SORT; BY code1;                                                                                                                   
DATA all; SET a1 a2; BY code1;                                                                                                         
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   1

                                               OBS    code1     x     y    z

                                                1       1      11    21    .
                                                2       2      33    11    5
                                                3       3      22    56    .
                                                4       3      45     6    7
                                                5       5      56    21    6
                                                6       7      76    43    7
♥♥♥♥♥
가볍게 설명해도 되려나?
위에 데이터와 아래 데이터를 code1으로 정렬해 놓고,
나중에 set으로 합친 것이다.
합치고 다시 code1으로 정렬했다.
뭐 한꺼번에 해도 될텐테 따로따로 하고, 왜 또하는지 모르겠다.
만약 DATA all; SET a1 a2;
요렇게만 쓰면, 어떻게 될까? 그렇다. 정답~

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   2

                                               OBS    code1     x     y    z

                                                1       1      11    21    .
                                                2       3      22    56    .
                                                3       2      33    11    5
                                                4       3      45     6    7
                                                5       5      56    21    6
                                                6       7      76    43    7

OBS 1~2가 위쪽 데이터, 3~6이 아래쪽 데이터가 된다.
y열 부분이 '.'으로 표기되어 더 알아보기가 쉽지 않은가? ㅋㅋ

좀 긴 문장을 살펴보자. 우리의 능력을 여기까지기 아니지 않는가?

♥♥♥♥♥
DATA a1; INPUT name $ x y; CARDS; /* a1데이터셋, 입력값은 name변수(문자), x, y(각각 숫자), 데이터들(아래) */                           
KIM  5 2                          /* 데이터 입력 시작 */                                                                               
PARK 3 4                                                                                                                               
LEE  2 7                                                                                                                               
CHOI 5 8                                                                                                                               
;                                 /* 데이터 입력 끝 */                                                                                 
PROC PRINT; VAR name x y;         /* name, x, y 변수들에 대해 결과를 출력하라 */                                                       
                                                                                                                                       
DATA b1; SET a1;                  /* b1데이터셋, a1의 변수를 사용한다 */                                                               
IF name='CHOI' OR x > y THEN DELETE; /* 이름이 CHOI거나 x값이 y값보다 크면 해당 자료행을 지워라 */                                     
PROC PRINT; /* 모든 결과를 출력하라 */                                                                                                 
PROC MEANS; /* 모든 평균값을 계산하라 */                                                                                               
                                                                                                                                       
DATA b1; SET a1; /* b1데이터셋, a1의 변수를 사용한다 */                                                                                
lx = LOG(x); /* lx 변수는 LOG(x)의 결과이다 */                                                                                         
cx = COS(X); /* cx 변수는 COS(x)의 결과이다 */                                                                                         
IF x > y THEN xy=1 /* x변수가 y보다 크다면 xy변수는 1이다 */                                                                           
c = 5 * (x < y) + 10 * (x > y); /* 무슨 의미인지...모르겠다; */                                                                        
PROC PRINT; /* 결과를 출력하라 */                                                                                                      
                                                                                                                                       
DATA c1; INPUT x y z    ; CARDS4; /* c1데이터셋, x y z 변수를 입력하겠다. 자료는 4(?)다 */                                             
1   2 4   /* 입력 시작*/                                                                                                               
3   4 6                                                                                                                                
;;;;      /* 입력 끝(4번을 반복하는 것인지, 다른 의미가 있는지는 모르겠다...  */                                                       
PROC PRINT;  /* 출력할 것 */                                                                                                           
                                                                                                                                       
DATA d1 (KEEP=x); SET a1; /* d1 데이터셋 (x를 유지해라??), a1데이터셋 이용 */                                                          
PROC PRINT; /* 출력하라 */                                                                                                             
DATA d1 (DROP=x); SET a1; /* d1 데이터셋 (x를 떨어뜨려라??), a1 데이터셋 이용 */                                                       
PROC PRINT; /* 출력하라 */                                                                                                             
                                                                                                                                       
DATA d1 (KEEP=name x) d2 (KEEP=name y); SET a1; /* d1데이터셋(name과 x 유지) d2데이터셋(name과 y유지), a1데이터셋 사용 */              
PROC PRINT DATA=d1; /*d1 데이터셋 출력 */                                                                                              
PROC PRINT DATA=d2; /*d2 데이터셋 출력 */                                                                                              
RUN; /*돌려돌려 */
♥♥♥♥♥
여기까지인데 이해는 잘 안되지만 생각되는 한도내에서 써봤다. 결과는 어떨까?
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   3

                                                   OBS    name    x    y

                                                    1     KIM     5    2
                                                    2     PARK    3    4
                                                    3     LEE     2    7
                                                    4     CHOI    5    8

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   4

                                                   OBS    name    x    y

                                                    1     PARK    3    4
                                                    2     LEE     2    7

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   5

                                                      MEANS 프로시저

                         변수    N          평균값        표준편차          최소값          최대값
                         -------------------------------------------------------------------------
                         x       2       2.5000000       0.7071068       2.0000000       3.0000000
                         y       2       5.5000000       2.1213203       4.0000000       7.0000000
                         -------------------------------------------------------------------------

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   6

                                                   OBS    name    x    y

                                                    1     PARK    3    4
                                                    2     LEE     2    7

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   7

                                                         OBS    x

                                                          1     5
                                                          2     3
                                                          3     2
                                                          4     5

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   8

                                                     OBS    name    y

                                                      1     KIM     2
                                                      2     PARK    4
                                                      3     LEE     7
                                                      4     CHOI    8

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초   9

                                                     OBS    name    x

                                                      1     KIM     5
                                                      2     PARK    3
                                                      3     LEE     2
                                                      4     CHOI    5

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  10

                                                     OBS    name    y

                                                      1     KIM     2
                                                      2     PARK    4
                                                      3     LEE     7
                                                      4     CHOI    8

♥♥♥♥♥
앞쪽은 이해가 가는데 중간부분부터 이해가 가지 않는다. 동영상 좀 보고 다시 돌아오겠다.
동영상에서는 딱 한 문장으로 설명하고 있다.
"보이시죠? DATA문 PROC문 ,DATA문 PROC문, DATA문 PROC문.... 이게 전형적인 SAS 문입니다."

네... 그렇습니다. 매우 전형적인 SAS 문들이 되겠습니다.
우리도 넘어가도록 하죠..;;

다음에 배울 MERGE문은 이전에 SET문과는 다르게 옆으로 붙이는 것이다.
이름 키
주몽 150
왕건 120

이름 몸무게
주몽 30
왕건 40

이런 두 자료가 있다면 어떻게 해야할까.
SET문을 사용하면 이렇게 될 것이다.
주몽 150
왕건 120
주몽 30
왕건 40

... 뭔소린가 이게..

이럴때 MERGE 문을 사용하면
주몽 150 30
왕건 120 40
이렇게 되는 것이다.
그럼 공부해보도록 하자.

♥♥♥♥♥
DATA a1; INPUT x y; CARDS;                                                                                                             
1 21                                                                                                                                   
2 56                                                                                                                                   
DATA a2; INPUT z @@; CARDS;                                                                                                            
11 22 33                                                                                                                               
;                                                                                                                                      
DATA all; MERGE a1 a2;                                                                                                                 
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  11

                                                   OBS    x     y     z

                                                    1     1    21    11
                                                    2     2    56    22
                                                    3     .     .    33
♥♥♥♥♥
a1 데이터셋; 입력값은 변수 x y; 자료들;
1 21
2 56
a2 데이터셋; 입력값은 z이고 일렬로 주욱 들어간다;
11 22 33
(실제로 다음 값이라고 생각하면 된다
11
22
33
알겠는가?)
데이터 끝;
모든 데이터셋; a1데이터셋과 a2데이터셋을 합쳐라(옆에다 붙여라)
출력하라;
돌려돌려;
♥♥♥♥♥
결과를 보면 알 수 있듯이, z라는 변수값에 아래로 주욱 값이 붙어서 합쳐진 것을 볼 수 있다.

자 그렇다면 또 궁금증이 생기는데?
만약 아주 만약에, 이런 자료 두개가 만나면 어찌될까?

슈퍼  감자가격
 1         21
 2         56

감자가격   고구마가격
  11              5
  22              6
  33              9

이 두가지를 옆으로 붙이면 어찌될까?
그냥 붙이겠지 생각하기 쉽지만 '감자가격'이라는 변수가 같다.
ㄱ- 이런 경우를 억지로라도 만들어서 돌려보도록 하자.
♥♥♥♥♥
DATA a1; INPUT x y; CARDS;                                                                                                             
1 21                                                                                                                                   
2 56                                                                                                                                   
DATA a2; INPUT y z @@; CARDS;                                                                                                          
11 5 22 6 33 9                                                                                                                         
;                                                                                                                                      
DATA all; MERGE a1 a2;                                                                                                                 
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  12

                                                    OBS    x     y    z

                                                     1     1    11    5
                                                     2     2    22    6
                                                     3     .    33    9

♥♥♥♥♥
헉! a2 데이터셋에 묻혀버렸다. 원래 이런건가?
아 맞다고 한다. 뒤에 있는 변수가 앞에 있는 변수를 치고 들어온다고 한다.
그럼 안 좋은것 아닌가? 음...

이럴 경우를 위해서 SAS는 또 다른 비책(?)을 가지고 있다고 한다.
만약  x y 변수와 y z 변수로 아까처럼 충돌하면
x y1 y2 z로 피해가게 만든단다. 그 방법을 알아보자.
♥♥♥♥♥
DATA a1; INPUT x y; CARDS;                                                                                                             
1 21                                                                                                                                   
2 56                                                                                                                                   
DATA a2; INPUT y z @@; CARDS;                                                                                                          
11 5 22 6 33 9                                                                                                                         
;                                                                                                                                      
DATA a1; SET a1; RENAME y=y1;                                                                                                          
DATA a2; SET a2; RENAME y=y2;                                                                                                          
DATA all; MERGE a1 a2;                                                                                                                 
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  13

                                                 OBS    x    y1    y2    z

                                                  1     1    21    11    5
                                                  2     2    56    22    6
                                                  3     .     .    33    9

♥♥♥♥♥
이거 살짝 억지스럽지 않은가? 그냥 위에서 INPUT 값을 바꿔주는게 낫겠다 ㄱ-;
아무튼 RENAME이란 구문으로 변수의 값을 바꿔줄 수 있는게 꼼수였다.
많은 데이터로 인해 어디에 있는 INPUT 구문인지 알 수 없다면 간단하게 손 볼 수 있을 것 같다.

이러니 저러니해도 지금까지의 MERGE문은 장난이란다.
아주! 강.력.한! MERGE 기능은 BY문과 결합했을때 그 위력이 나온다고 하는데...
그 강력함에 취해보자.

♥♥♥♥♥
DATA a1; INPUT sex $ x y @@; CARDS;                                                                                                    
F 1 21  F 4 34  F 5 42                                                                                                                 
M 2 56  M 3 77                                                                                                                         
PROC SORT; BY sex;                                                                                                                     
DATA a2; INPUT sex $ z; CARDS;                                                                                                         
F 11                                                                                                                                   
M 22                                                                                                                                   
;                                                                                                                                      
DATA all; MERGE a1 a2; BY sex;                                                                                                        
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  14

                                                OBS    sex    x     y     z

                                                 1      F     1    21    11
                                                 2      F     4    34    11
                                                 3      F     5    42    11
                                                 4      M     2    56    22
                                                 5      M     3    77    22

♥♥♥♥♥
뭔가 혼란스럽지 않은가.
어떻게 z값이 저렇게 다 들어갈 수 있을까.
d2부분에서 우리는 성별로 어떤 값을 지정해줬다.
F면 11을, M이면 22를..
같이 MERGE를 시키려고 보니까, F가 하나가 아니다. 다 F는 F다. 그래서 다 11을 붙여줬다.
라고 설명하는 길 밖에는 없겠다. M도 마찬가지.
이건 정말 유용하게 쓸 수 있을 것 같은 느낌이 팍 온다.

책에서는 데이터의 분류코드 체계가 서로 다른 경우 새로운 코드 또는 하나의 일관성 있는 코드로 조정할 필요가 있는데, 이럴 경우 매우 유용하다고 한다.
♥♥♥♥♥
DATA a1; INPUT code1 x y @@;                                                                                                           
CARDS;                                                                                                                                 
11 1 21   21 4 34                                                                                                                      
51 2 56   41 3 77                                                                                                                      
PROC SORT; BY code1;                                                                                                                   
DATA a2; INPUT code1 code2 $;                                                                                                          
CARDS;                                                                                                                                 
11 a1                                                                                                                                  
21 b1                                                                                                                                  
31 c1                                                                                                                                  
61 f1                                                                                                                                  
;                                                                                                                                      
DATA all; MERGE a1 a2; BY code1;                                                                                                       
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  15

                                             OBS    code1    x     y    code2

                                              1       11     1    21     a1
                                              2       21     4    34     b1
                                              3       31     .     .     c1
                                              4       41     3    77
                                              5       51     2    56
                                              6       61     .     .     f1

♥♥♥♥♥
있는 것은 있게, 없는 것은 없게 정렬이 된다.
개인적으로는 SET문보다 MERGE문이 더 중요하다고 보여진다.


오늘의 마지막 구문. UPDATE문에 대해서 알아보자.
일전에 한 번 등장했었는데 뭐지? 하고 넘어갔던 것 같다.
뭐 공부하다보면 보기 싫어도 하나씩 만나게 된다.
평소에 만나지 못하는 녀석이라만 더 반가워야 하는게 아닐까?
마지막 구문이고 하니 즐겁게 손흔들며 시작해보자. 'ㅡ'/ 할룽~

UPDATE문은 원래 있는 데이터셋에 변회된 부분만을 수정하려 할 때 사용한다.
MERGE문과 유사하지만 반드시 BY문을 사용해야 한단다.
하기사 뭘 UPDATE 하는지는 알아야겠지;;;
MERGE에서는 뒤에 오는 데이터셋의 변수가 MISSING이면 MISSING으로 처리되지만, UPDATE는 원래의 값을 갖는게 다른 점이라고 한다.

형식은 다음과 같다.
DATA 새로운 이름; UPDATE 기존 이름들; BY 변수명;

늘 그렇듯이 이렇게 보면 전혀 감이 안온다.
역시 예문이다. 고고싱.

♥♥♥♥♥
DATA a1; INPUT code1 x y @@;                                                                                                           
CARDS;                                                                                                                                 
11 1 2   21 4 3                                                                                                                        
51 2 5   41 3 7                                                                                                                        
PROC SORT; BY code1;                                                                                                                   
DATA a2; INPUT code1 y z;                                                                                                              
CARDS;                                                                                                                                 
11 1 111                                                                                                                               
21 . 222                                                                                                                               
31 3 333                                                                                                                               
41 4 777                                                                                                                               
71 7 777                                                                                                                               
;                                                                                                                                      
DATA all; UPDATE a1 a2; BY code1;                                                                                                      
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  16

                                               OBS    code1    x    y     z

                                                1       11     1    1    111
                                                2       21     4    3    222
                                                3       31     .    3    333
                                                4       41     3    4    777
                                                5       51     2    5      .
                                                6       71     .    7    777

♥♥♥♥♥
눈 여겨 볼 점은 code1이 21일때 y변수 값이다. a1 데이터셋에서 3 값인데, a2 데이터셋에서 '.'으로 처리되어 덮여씌워지지 않았다. 결과 값에도 y값이 3으로 나오는 것을 알 수 있다.
색상으로 나타내도록 하겠다.

자 다 끝났다.
오늘 왠지 평소보다 배운게 없어서 섭섭하지 않은가?
아니라고? 그렇지만 뒷 단원에서 나오는 내용을 책에서 살짝 언급하고 있다.
반페이지정도?
뭐 이것도 7장에 나온 내용이니 구경이나 하며 마치도록 하겠다.

프로그램 상에서도 데이터셋을 만들 수 있다고 한다.
+_+ 아니! 그럴수가!! 라는 분도 계실것이고, 데이터셋이 뭐냐고 생각하는 사람도 있을 것이다.
...이렇게 쓰면 알까...
DATA a1;
a1 데이터셋을 만들자.

이해하는가?
새로운 데이터셋을 프로그램 실행하며 만들려면 OUTPUT 이라는 명령어가 필요하다고 한다.
10장에서 다시 언급하겠지만, 기본적인 개념을 알아보자.

♥♥♥♥♥
DATA a1; INPUT sex $ x; CARDS;                                                                                                         
F 1                                                                                                                                    
F 3                                                                                                                                    
F 5                                                                                                                                    
M 2                                                                                                                                    
M 4                                                                                                                                    
;                                                                                                                                      
PROC MEANS; VAR x;                                                                                                                     
OUTPUT OUT=aa1 SUM=sx1; BY sex;                                                                                                        
PROC PRINT; VAR sex sx1;                                                                                                               
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  17

---------------------------------------------------------- sex=F ----------------------------------------------------------

                                                      MEANS 프로시저

                                                       분석 변수 : x

                             N          평균값        표준편차          최소값          최대값
                             -----------------------------------------------------------------
                             3       3.0000000       2.0000000       1.0000000       5.0000000
                             -----------------------------------------------------------------


---------------------------------------------------------- sex=M ----------------------------------------------------------

                                                       분석 변수 : x

                             N          평균값        표준편차          최소값          최대값
                             -----------------------------------------------------------------
                             2       3.0000000       1.4142136       2.0000000       4.0000000
                             -----------------------------------------------------------------

                                                        SAS 시스템            2007년 02월 19일 월요일 오후 08시53분20초  18

                                                     OBS    sex    sx1

                                                      1      F      9
                                                      2      M      6

♥♥♥♥♥
OUTPUT OUT=aa1 SUM=sx1; BY sex;
남녀별로 변수 x에 대하여 SAS 데이터셋 'aa1'에 sx1이란 변수명으로 보관한다고 한다.
이게 왜 남녀별로 되는건지는 나도 잘 모르겠다.
아무래도 10장에 가서 이해를 하는게 수월 할 것 같다.

좋은 하루, 그리고 내일도 알찬 하루를 만들도록 하자.

by Joe & Soohy 2007. 2. 19. 18:01