Base R 中是否有一种方法可以复制 Excel 中的 VLOOKUP TRUE 的作用?

Is there a way in Base R to replicate what VLOOKUP TRUE in Excel does?

我的消费模式是这样的:

x <-0:10
y<-c(0, 0.05, 0.28, 0.45, 0.78, 0.86, 0.90, 0.92, 0.95, 0.98, 1.00)

X 以年为单位,Y 并不总是单调递增,尽管大多数时候应该是这样。

如果我需要估计在消耗 80% 之前需要多少年,在 Excel 中,我会使用 VLOOKUP TRUE 函数,它会 return 78%,然后我会查找系列中的下一个值 (86%),然后线性插值得到 4.25 年。这很费力,但它完成了工作。

有没有一种简单的方法可以在 R 中用我可以应用于许多情况的用户定义函数来计算它?

谢谢!

你可以试试 approx

resolution <- 1000
fn <- approx(x, y, n=resolution)
min(fn$x[fn$y > 0.8])
[1] 4.254254

您需要的估算值越高,resolution

的数值就越大
x <- 0:10
y <- c(0, 0.05, 0.28, 0.45, 0.78, 0.86, 0.90, 0.92, 0.95, 0.98, 1.00)


estimate_years <- function(x, y, percent) {
  idx <- max(which(y < percent))
  (percent - y[idx]) / (y[idx+1] - y[idx]) * (x[idx+1] - x[idx]) + x[idx]
}

estimate_years(x, y, 0.80) ## 4.25

虽然approx计算很酷, 这里的精确线性插值很容易。 idxyx 的下一个较小位置。 因此,idx+1yx 相对于 percentage 的下一个 equal/bigger 位置。

通过三角计算,其中 k = part / total 这是 (percent - y[idx]) / (y[idx+1] - y[idx])

并应用 k * total_x 此处用 k * (x[idx+1] - x[idx]) 表示 - 线性插值的结果 并添加最近较小的年份 x[idx],得到结果