Или следуя тому, что вы уже пробовали:
dfdf$b[which.min(abs(index - dfdf$a))]
# [1] 300
В качестве примечания (не уверен, каким должен быть ваш результат, если есть два совпадения):
dfdf<-data.frame(a= c(80,90,105,105,120),
b= c(500,400,300,200,100))
index= 105
dfdf$b[which.min(abs(index - dfdf$a))]
# [1] 300
dfdf[findInterval(index, dfdf$a),"b"]
# [1] 200
Еще одно развлечение например:
dfdf<-data.frame(a= c(80,90,100,105,120),
b= c(500,400,300,200,100))
index= 95
dfdf$b[which.min(abs(index - dfdf$a))]
# [1] 400
dfdf[findInterval(index, dfdf$a),"b"]
# [1] 400