【问题标题】:R: find nearest indexR:找到最近的索引
【发布时间】:2012-04-15 07:54:35
【问题描述】:

我有两个有几千个点的向量,但在这里概括:

A <- c(10, 20, 30, 40, 50)
b <- c(13, 17, 20)

我如何获得与b最接近A 的索引?预期的结果是c(1, 2, 2)

我知道findInterval 只能找到第一个匹配项,而不是最近的匹配项,而且我知道which.min(abs(b[2] - A)) 正在变暖,但我不知道如何对其进行矢量化以处理长向量Ab

【问题讨论】:

    标签: r vectorization nearest-neighbor


    【解决方案1】:

    你可以把你的代码放在一个 sapply 中。我认为这与 for 循环具有相同的速度,因此在技术上并没有矢量化:

    sapply(b,function(x)which.min(abs(x - A)))
    

    【讨论】:

    • 请注意which.min() 只返回第一个匹配项。可能还有其他元素同样接近。
    【解决方案2】:

    FindInterval 让您非常接近。您只需要在它返回的偏移量和下一个偏移量之间进行选择:

    #returns the nearest occurence of x in vec
    nearest.vec <- function(x, vec)
    {
        smallCandidate <- findInterval(x, vec, all.inside=TRUE)
        largeCandidate <- smallCandidate + 1
        #nudge is TRUE if large candidate is nearer, FALSE otherwise
        nudge <- 2 * x > vec[smallCandidate] + vec[largeCandidate]
        return(smallCandidate + nudge)
    }
    
    nearest.vec(b,A)
    

    返回 (1,2,2),在性能上应该与 FindInterval 相当。

    【讨论】:

    • 真的很有用,谢谢。我很惊讶在基地没有什么可以做的。这可能意味着存在但我不知道......!
    【解决方案3】:

    这是一个使用 R 经常被忽视的outer 函数的解决方案。不确定它是否会表现得更好,但它确实避免了sapply

    A <- c(10, 20, 30, 40, 50)
    b <- c(13, 17, 20)
    
    dist <- abs(outer(A, b, '-'))
    result <- apply(dist, 2, which.min)
    
    # [1] 1 2 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2016-07-19
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多