FYI . Cwt is current weight bwt is base weight. data test; input subject visit cwt bwt 8.; datalines; 1 1 78 80 1 2 79 . 1 3 70 . 1 4 72 . 1 5 74 . 1 6 88 . 1 7 70. 2 1 51 50 2 2 58 . ; run; proc sort data=test; by subject visit; run; data test1; set test; by subject visit; f= first.subject; if f ne 1 then call missing(bwt); if n(cwt, bwt) = 2 then pdiff = round((cwt - bwt)*100/bwt,0.1); if . < pdiff <= 10 then dwt = bwt; else if pdiff > 10 then dwt = cwt; run; data test2; do i = 1 by 1 until(last.subject); set test1; array bbwt bwt1 - bwt4; bbwt(i) = lag(dwt); by subject visit; if f ne 1 then bwt = bbwt(i); if n(cwt, bwt) = 2 then pdiff = round((cwt - bwt)*100/bwt,0.1); if . < pdiff <= 10 then dwt = bwt; else if pdiff > 10 then dwt = cwt; output; end; run;