Approximate lookup in R

强颜欢笑 提交于 2019-11-29 20:03:04

问题


I have the following lookup table:

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)
       )

I would like to get the value of Y of a given X value.

If the X value exists in the table then the exact Y of the table should be returned. If the X value does not exist, then the Y value should be returned as linear interpolation of the 2 nearest neighbors (only the 2 nearest neighbors). I would not like to fit a model to the overall data.

for the above table

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)

Is there any ready function to do this?


回答1:


Yes, it's called approx.

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

$y
[1] 1.0000000 0.9123404

See ?approx for more information.




回答2:


I do not think there is a ready function for this, but you could build one quite easily. E.g.:

A function for getting "neighbourgs" (the name is a bit misleading, but the function works):

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)
    }
}

It will return the exact "ID" if a value is found in vector, otherways it will return two "IDs" (two smaller values before that). It requires that your data is ordered! If not, you have to tweak it a bit. Examples of usage:

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

Using this, a simple function can be built to get the mean of requiredy values, like:

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

Examples:

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

Hope that helps.



来源:https://stackoverflow.com/questions/7703553/approximate-lookup-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!