Online File
Rick Aster: Professional SAS Programming Shortcuts: Contents
PROC SORT DATA=SERIES; BY SEQ; RUN; DATA BEFORE (KEEP=SEQ BEFORE_SEQ BEFORE_V); SET SERIES; RETAIN BEFORE_SEQ BEFORE_V; IF V <= .Z THEN DO; IF BEFORE_SEQ THEN OUTPUT; END; ELSE DO; BEFORE_SEQ = SEQ; BEFORE_V = V; END; RUN; PROC SORT DATA=SERIES OUT=REVERSE; BY DESCENDING SEQ; RUN; DATA AFTER (KEEP=SEQ AFTER_SEQ AFTER_V); SET REVERSE; RETAIN AFTER_SEQ AFTER_V; IF V <= .Z THEN DO; IF AFTER_SEQ THEN OUTPUT; END; ELSE DO; AFTER_SEQ = SEQ; AFTER_V = V; END; RUN; PROC SORT DATA=AFTER; BY SEQ; RUN; DATA INTERPOL (KEEP=SEQ V SOURCE); MERGE SERIES BEFORE AFTER; BY SEQ; IF V > .Z THEN DO; SOURCE = 'A'; * Actual; OUTPUT; END; ELSE IF BEFORE_V > .Z AND AFTER_V > .Z THEN DO; SOURCE = 'I'; * Interpolated; V = BEFORE_V + (AFTER_V - BEFORE_V)* (SEQ - BEFORE_SEQ)/(AFTER_SEQ - BEFORE_SEQ); OUTPUT; END; ELSE DO; SOURCE = 'X'; * Not available; V = .; OUTPUT; END; RUN; TITLE1 'Interpolation'; PROC PRINT NOOBS HEADING=H; RUN;