ポスターは値を調べることについて質問しませんでしたexact=FALSE
が、私自身の参照やおそらく他の人のための答えとしてこれを追加しています。
カテゴリ値を検索している場合は、他の回答を使用してください。
Excelvlookup
では、数値の一致を4番目の引数(1)とほぼ一致させることもできますmatch=TRUE
。私はmatch=TRUE
体温計で値を調べるようなもの。デフォルト値はFALSEで、カテゴリ値に最適です。
ほぼ一致させたい(ルックアップを実行したい)場合、Rには、findInterval
(名前が示すように)連続数値を含む区間/ビンを見つけるという関数があります。
ただし、findInterval
いくつかの値を指定したいとします。ループを作成するか、適用関数を使用できます。ただし、DIYのベクトル化されたアプローチを採用する方が効率的であることがわかりました。
xとyでインデックス付けされた値のグリッドがあるとしましょう。
grid <- list(x = c(-87.727, -87.723, -87.719, -87.715, -87.711),
y = c(41.836, 41.839, 41.843, 41.847, 41.851),
z = (matrix(data = c(-3.428, -3.722, -3.061, -2.554, -2.362,
-3.034, -3.925, -3.639, -3.357, -3.283,
-0.152, -1.688, -2.765, -3.084, -2.742,
1.973, 1.193, -0.354, -1.682, -1.803,
0.998, 2.863, 3.224, 1.541, -0.044),
nrow = 5, ncol = 5)))
xとyで調べたい値がいくつかあります。
df <- data.frame(x = c(-87.723, -87.712, -87.726, -87.719, -87.722, -87.722),
y = c(41.84, 41.842, 41.844, 41.849, 41.838, 41.842),
id = c("a", "b", "c", "d", "e", "f")
視覚化された例は次のとおりです。
contour(grid)
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)
次のタイプの式を使用して、x間隔とy間隔を見つけることができます。
xrng <- range(grid$x)
xbins <- length(grid$x) -1
yrng <- range(grid$y)
ybins <- length(grid$y) -1
df$ix <- trunc( (df$x - min(xrng)) / diff(xrng) * (xbins)) + 1
df$iy <- trunc( (df$y - min(yrng)) / diff(yrng) * (ybins)) + 1
これをさらに一歩進めて、次のgrid
ようにz値に対して(単純な)補間を実行できます。
df$z <- with(df, (grid$z[cbind(ix, iy)] +
grid$z[cbind(ix + 1, iy)] +
grid$z[cbind(ix, iy + 1)] +
grid$z[cbind(ix + 1, iy + 1)]) / 4)
これはあなたにこれらの値を与えます:
contour(grid, xlim = range(c(grid$x, df$x)), ylim = range(c(grid$y, df$y)))
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)
text(df$x + .001, df$y, lab=round(df$z, 2), col="blue", cex=1)
df
ixとiyは、を使用したループでも検出できた可能性があることに注意してください。findInterval
たとえば、2行目の例を次に示します。
findInterval(df$x[2], grid$x)
findInterval(df$y[2], grid$y)
どの試合ix
やiy
でdf[2]
脚注:(1)vlookupの4番目の引数は、以前は「match」と呼ばれていましたが、リボンが導入された後、「[range_lookup]」に名前が変更されました。