/********************************************************************* FILENAME: SAFEUPDATE.SAS SUBJECT HEADING: DATA INITIALS: BML DATE: 31 JUL 96 PROGRAM: SAS VERSION: 6.11 TS040 PLATFORM: WINDOWS TITLE: CONDITIONALLY REPLACE THE VALUES OF A DATASET WITH NEW VALUES FROM A TRANSACTION DATASET DESCRIPTION: IF YOU WANT TO UPDATE THE MISSING VALUES (AND ONLY THE MISSING VALUES) OF A MASTER DATASET WITH NEW VALUES FROM A TRANSACTION DATSET, THIS CODE WILL DO IT! YOU MUST HAVE AN ID VARIABLE IN EACH DATASET THAT UNIQUELY IDENTIFIES EACH CASE. **********************************************************************/ options linesize=72; /* FIRST WE CREATE A MASTER DATASET THAT CONTAINS MISSING VALUES FOR SOME OF THE VARIABLES. */ data master; input id var1 var2 $ var3; datalines; 1 3478 able 234.45 2 4562 . 634.23 3 . charlie . 4 5695 delta . 5 . . 575.12 ; proc print data=master; title 'printout of master dataset with missing values'; run; /* NOW WE CREATE A TRANSACTION DATASET THAT HAS REPLACEMENT VALUES FOR SOME OF THE MISSING DATA IN THE MASTER DATASET. */ data transact; input id var1 var2 $ var3; datalines; 3 . . 999.99 5 . gamma 999.99 ; proc print data=transact; title 'printout of transaction dataset with replacement values'; run; /* NOW WE SORT BOTH DATA SETS BY THE COMMON CASE ID VARIABLE. */ proc sort data=master; by id; proc sort data=transact; by id; run; /* FINALLY, WE UPDATE THE MASTER DATASET WITH THE NEW VALUES. NOTE THAT THE TRANSACTION DATASET COMES SECOND IN THE UPDATE STATEMENT. ALSO NOTE THAT THE VALUE 575.12 FOR VAR3 IN CASE 5 OF THE ORIGINAL DATASET WAS NOT CHANGED! */ data final(drop=newvar1 newvar2 newvar3); present = 0; merge master(in=present) transact(rename=(var1=newvar1 var2=newvar2 var3=newvar3)); by id; if var1 = . then var1 = newvar1; if var2 = '' then var2 = newvar2; if var3 = . then var3 = newvar3; if present; run; proc print data=final; title 'printout of dataset with updated values'; run;