Вот базовое решение:
ave(df,df$iso, FUN =function(y){
if(nrow(y) > 1) y[3:5] <- lapply(y[3:5], function(x) approx(y$year,x,y$year,rule=2)$y)
y
})
# iso year var1 var2 var3
# 1 XXX 2005 165 29 2151.0
# 2 XXX 2006 160 21 2139.0
# 3 XXX 2007 172 15 2889.5
# 4 XXX 2008 184 9 3640.0
# 5 XXX 2009 184 9 3640.0
# 6 YYY 2005 206 461 8049.0