본문 바로가기
의학통계/SAS Tip

SAS의 Data step의 Modify문장 이용하여 Match 여부 처리하는 방법

by boogler 2022. 7. 12.
반응형

SAS의 Data step의 Modify문장 이용하여 Match 여부 처리하는 방법

Data step의 Modify 문장과 By, Key를 함께 이용하여 Match된 데이터는 update 하고, Match되지 않는 데이터는 insert (append) 처리하는 것을 예제를 통해 알아보겠습니다.


EX. 사망코드 Master table을 만들기 위해 기존의 사망코드데이터(test.death)와 완전하지 않은 death_master 데이터를 합하여 완전한 death_master 데이터를 2가지 방법으로 생성해 보겠습니다.

 

▶목표 : death_master table 의 deathDesc를 test.death 기준으로 update하고, master에 없는 사망코드는 death_master에 append해서 완전한 death_master 를 생성한다.

 

SAS 예제 데이터 형태

 

1. Data step의 Modify + By 문장을 이용하는 경우

 

< SAS Code >

 

data death_master;
      modify death_master test.death;by deathcode;
      if _iorc_= 0 then replace;       /* matched 된 경우 */    
      else 
           output;                                /* match된것이 없는 경우 */
run;

 

- _iorc_= 0 인 경우 deathcode로 test.death에 있는 경우 death_master의 deathdesc를 update합니다.

- _iorc_^=0 인 경우는 해당 레코드를 그대로 output합니다.

 

< SAS Output >

 

 목표한대로 match된 deathdesc는 update 되었고, C170, D580, D580 코드는 append 된 결과를 볼수 있습니다.

death_master 데이터셋(1)

 

2. Data step의 Modify + Key (index) 문장을 이용하는 경우

test.death의 t_deathdesc 를 death_master 데이터셋에 update, append 를 Modify + Key문장을 이용한 예제입니다.

 

< SAS Code >

 

data test.death;
set test.death;
t_deathdesc=deathdesc;
drop deathdesc;
run;

 

proc datasets lib=work nolist;
   modify death_master;
       index create deathcode/unique;
quit;

data death_master;
     set test.death;
     modify death_master key=deathcode;
     select (_iorc_);
           when (%sysrc(_sok)) do;                                                           /* Match : Update */
                    deathdesc=compress(t_deathdesc)||' - '||'updated';
                    replace;
           end;
           when (%sysrc(_dsenom)) do;
                    deathdesc=t_deathdesc;                                                   /* Match 되지 않은것은 Append */ 
                    output;
                    _error_= 0;
           end;
          otherwise do;
               put '----I/O Error-----';                                                              /* Unexpected I/O error */ 
               _error_= 0;
          end;
   end;
run; 

 

< SAS Output >

 

1번 예제와 결과는 동일하나, update된 데이는 'updated' 이라는 string을 붙여서 저장한 결과를 볼 수 있습니다.

death_master 데이터셋(2)

 

2022.07.09 - [의학통계/SAS Tip] - SAS에서 Index 만드는 3가지 방법

2022.07.11 - [의학통계/SAS Tip] - SAS의 Data step의 Set문장 이용하여 Match 여부 처리하는 방법

댓글