R中的近似查找

时间:2011-10-09 12:38:25

标签: r lookup

我有以下查找表:

lkp <- data.frame(
         x=c(0,0.2,0.65,0.658,1.3,1.76,2.7), 
         y=c(1,1,1,0.942,0.942, 0.92, 0.89)
       )

我想获得给定X值的Y值。

如果表中存在X值,则应返回表的确切Y. 如果X值不存在,那么Y值应该作为2个最近邻居(仅2个最近邻居)的线性插值返回。我不想让模型适合整体数据。

上表

for X=0.2 Y=1 (exact lookup) 
for X=2 Y=0.91 (linear interpolation between the last 2 rows of the data frame)

有没有准备好的功能呢?

2 个答案:

答案 0 :(得分:10)

是的,它被称为approx

> with(lkp, approx(x, y, xout=c(0.2, 2)))
$x
[1] 0.2 2.0

$y
[1] 1.0000000 0.9123404

有关详细信息,请参阅?approx

答案 1 :(得分:0)

我认为没有现成的功能,但你可以很容易地构建一个。 E.g:

获取“neighbourgs”的功能(名称有点误导,但功能有效):

get.neighbourgs <- function(vector, x) {
diff <- vector-x
if (any(diff==0)) {
    return(which(diff==0))
    } else {
        lower <- tail(which(diff<0), 1)
        return((lower-1):lower)
    }
}

如果在vector中找到一个值,它将返回确切的“ID”,否则它将返回两个“ID”(之前两个较小的值)。它要求您订购数据!如果没有,你必须稍微调整一下。用法示例:

> get.neighbourgs(lkp$x,1.3)
[1] 5
> get.neighbourgs(lkp$x,2)
[1] 5 6

使用它,可以构建一个简单的函数来获得所需y值的平均值,如:

get.y <- function(df, x) {
    mean(df$y[get.neighbourgs(df$x, x)])
}

示例:

> get.y(lkp, 1.2)
[1] 0.971
> get.y(lkp, 2)
[1] 0.931

希望有所帮助。

相关问题