I like the terse 2-pass solution by @PeterClemmensen . However, it can also be done in a single pass, while avoiding unnecessary computations:
data have ;
input var1: $1. var2 var3 ;
cards ;
A 1 157
A 2 130
A 3 67
A 4 -54
A 5 -89
A 6 -101
B 1 500
B 2 456
B 3 234
B 4 -10
B 5 -303
B 6 -409
C 1 239
C 2 210
C 3 150
C 4 -2
C 5 -30
C 6 -44
run ;
data need ;
do until (last.var1) ;
set have ;
by var1 ;
if N (var) then continue ;
if var3 < 0 then do ;
var = var2 + (var2 - _var2) * divide (_var3, _var3 - var3) ;
output ;
end ;
_var2 = var2 ;
_var3 = var3 ;
end ;
run ;
Kind regards
Paul D.
... View more