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
计算很酷,
这里的精确线性插值很容易。
idx
是 y
和 x
的下一个较小位置。
因此,idx+1
是 y
和 x
相对于 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]
,得到结果
我的消费模式是这样的:
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
计算很酷,
这里的精确线性插值很容易。
idx
是 y
和 x
的下一个较小位置。
因此,idx+1
是 y
和 x
相对于 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]
,得到结果