L'affiche n'a pas demandé de rechercher des valeurs si exact=FALSE
mais je l'ajoute comme réponse pour ma propre référence et peut-être pour d'autres.
Si vous recherchez des valeurs catégorielles, utilisez les autres réponses.
Excel vlookup
vous permet également d'établir une correspondance approximative pour les valeurs numériques avec le 4ème argument(1) match=TRUE
. Je pense à match=TRUE
comme la recherche de valeurs sur un thermomètre. La valeur par défaut est FALSE, ce qui est parfait pour les valeurs catégoriques.
Si vous voulez faire correspondre approximativement (effectuer une recherche), R dispose d'une fonction appelée findInterval
qui (comme son nom l'indique) trouvera l'intervalle / la case qui contient votre valeur numérique continue.
Cependant, disons que vous voulez findInterval
pour plusieurs valeurs. Vous pourriez écrire une boucle ou utiliser une fonction d'application. Cependant, j'ai trouvé plus efficace d'adopter une approche vectorielle bricolée.
Disons que vous disposez d'une grille de valeurs indexées par x et 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)))
et vous avez des valeurs que vous voulez rechercher par x et 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")
Voici l'exemple visualisé :
contour(grid)
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)
![Contour Plot]()
Vous pouvez trouver les intervalles x et les intervalles y avec ce type de formule :
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
Vous pouvez aller un peu plus loin et effectuer une interpolation (simpliste) sur les valeurs z en grid
comme ça :
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)
Ce qui vous donne ces valeurs :
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)
![Contour plot with values]()
df
# x y id ix iy z
# 1 -87.723 41.840 a 2 2 -3.00425
# 2 -87.712 41.842 b 4 2 -3.11650
# 3 -87.726 41.844 c 1 3 0.33150
# 4 -87.719 41.849 d 3 4 0.68225
# 6 -87.722 41.838 e 2 1 -3.58675
# 7 -87.722 41.842 f 2 2 -3.00425
Notez que ix, et iy auraient également pu être trouvés avec une boucle utilisant findInterval
Voici un exemple pour la deuxième ligne.
findInterval(df$x[2], grid$x)
# 4
findInterval(df$y[2], grid$y)
# 2
Qui correspond ix
y iy
sur df[2]
Note de bas de page : (1) Le quatrième argument de vlookup était auparavant appelé "match", mais après l'introduction du ruban, il a été renommé "[range_lookup]".