Plakat nie zawierał pytania o szukanie wartości, jeśli exact=FALSE, ale dodam to jako odpowiedź dla siebie i być może dla innych.
Jeśli szukasz wartości kategorycznych, użyj innych odpowiedzi.
W programie Excel można vlookuprównież dopasować w przybliżeniu wartości liczbowe do czwartego argumentu (1) match=TRUE. Myślę o match=TRUEsprawdzaniu wartości na termometrze. Wartością domyślną jest FALSE, co jest idealne dla wartości jakościowych.
Jeśli chcesz dopasować w przybliżeniu (przeprowadzić wyszukiwanie), R ma funkcję o nazwie findInterval, która (jak sama nazwa wskazuje) znajdzie przedział / przedział, który zawiera ciągłą wartość liczbową.
Jednak powiedzmy, że chcesz findIntervaldla kilku wartości. Możesz napisać pętlę lub użyć funkcji stosującej. Jednak wydaje mi się, że bardziej wydajne jest podejście wektoryzowane DIY.
Powiedzmy, że masz siatkę wartości indeksowanych przez x i 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)))
i masz pewne wartości, które chcesz sprawdzić według x i 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")
Oto zwizualizowany przykład:
contour(grid)
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)

Możesz znaleźć odstępy x i odstępy y za pomocą tego typu formuł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
Możesz pójść o krok dalej i wykonać (uproszczoną) interpolację wartości z w gridnastępujący sposób:
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)
Który daje te wartości:
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
Zwróć uwagę, że ix i iy można było również znaleźć za pomocą pętli przy użyciu findInterval, np. Tutaj jest jeden przykład dla drugiego wiersza
findInterval(df$x[2], grid$x)
findInterval(df$y[2], grid$y)
Które mecze ixi iywdf[2]
Przypis: (1) Czwarty argument funkcji vlookup był wcześniej nazywany „dopasowaniem”, ale po wprowadzeniu wstążki została zmieniona na „[wyszukiwanie_zakresu]”.