7

数千のポイントを持つ 2 つのベクトルがありますが、ここで一般化します。

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

に最も近いAのインデックスを取得するにはどうすればよいですか? 予想される結果は です。bc(1, 2, 2)

私はそれfindIntervalが最初の出現のみを見つけることができ、最も近いものではないことを知っています.それが暖かくなっていることは知っていますが、それをベクトル化して両方のwhich.min(abs(b[2] - A))長いベクトルで動作させる方法を理解できませんAb

4

3 に答える 3

12

コードをsapplyに入れるだけです。これはforループと同じ速度であるため、技術的にはベクトル化されていないと思います。

sapply(b,function(x)which.min(abs(x - A)))
于 2012-04-15T08:02:10.587 に答える
11

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 に匹敵します。

于 2013-01-15T12:25:37.963 に答える