Hi Pete, Try the following. The trick was to set up a "flag" to check whether the first replacement had been done. The code flow is adjusted based on the flag content. Some streamlining may be useful (e.g. the flag could be a macro variable) but the code does the job. data want; flag = 0; do until(last.Road_Id); if Road_Id ~= Lag(Road_Id) then flag = 0; set have; by Road_Id; if first.Road_Id then _Age = age; else _Age = _Age + 1; if flag = 0 then Lifespan = Lifespan_A; else Lifespan = Lifespan_B; if _Age > Lifespan then do; Replace = "YES"; _Age = 1; CAPEX_ReplaceYr = CAPEX_B; flag = 1; end; else do; Replace = "NO"; call missing(CAPEX_ReplaceYr); end; if flag = 0 then do; OPEX = OPEX_Age1_A * (1 + (_Age-1) * 0.1); end; else do; OPEX = OPEX_Age1_B * (1 + (_Age-1) * 0.1); end; output; end; rename _age=age; drop age flag Lifespan; run;
... View more