【问题标题】:Approximate lookup in RR中的近似查找
【发布时间】:2011-10-09 12:38:24
【问题描述】:

我有以下查找表:

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)

有没有现成的功能可以做到这一点?

【问题讨论】:

    标签: r lookup


    【解决方案1】:

    是的,它叫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)!感谢您指出我对这个有用功能的关注,最后我一定要完整阅读 R 的介绍 :) 无论如何,我不会删除我的答案,让它作为编写这样的小函数的基本示例.
    • 完美!谢谢!数据框是否需要排序或其他什么?帮助文件中没有任何说明。
    • @ECII 令我惊讶的是,它不需要排序。试试看:lkp &lt;- lkp[sample(1:7), ]
    【解决方案2】:

    我不认为有一个现成的功能,但你可以很容易地构建一个。例如:

    获取“邻居”的函数(名称有点误导,但函数有效):

    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
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      相关资源
      最近更新 更多