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 vlookup
również dopasować w przybliżeniu wartości liczbowe do czwartego argumentu (1) match=TRUE
. Myślę o match=TRUE
sprawdzaniu 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 findInterval
dla 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 grid
nastę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 ix
i iy
wdf[2]
Przypis: (1) Czwarty argument funkcji vlookup był wcześniej nazywany „dopasowaniem”, ale po wprowadzeniu wstążki została zmieniona na „[wyszukiwanie_zakresu]”.