Das Poster hat nicht nach dem exact=FALSE
Nachschlagen von Werten gefragt , aber ich füge dies als Antwort für meine eigene Referenz und möglicherweise für andere hinzu.
Wenn Sie nach kategorialen Werten suchen, verwenden Sie die anderen Antworten.
Mit Excel vlookup
können Sie auch die Übereinstimmung für numerische Werte ungefähr mit dem 4. Argument (1) abgleichen match=TRUE
. Ich denke daran match=TRUE
, Werte auf einem Thermometer nachzuschlagen. Der Standardwert ist FALSE, was perfekt für kategoriale Werte ist.
Wenn Sie ungefähr übereinstimmen möchten (eine Suche durchführen), hat R eine Funktion namens findInterval
, die (wie der Name schon sagt) das Intervall / den Bin findet, das Ihren fortlaufenden numerischen Wert enthält.
Angenommen, Sie möchten findInterval
für mehrere Werte. Sie können eine Schleife schreiben oder eine Apply-Funktion verwenden. Ich habe es jedoch effizienter gefunden, einen vektorisierten DIY-Ansatz zu wählen.
Angenommen, Sie haben ein durch x und y indiziertes Wertegitter:
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)))
und Sie haben einige Werte, die Sie mit x und y nachschlagen möchten:
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")
Hier ist das visualisierte Beispiel:
contour(grid)
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)
Sie können die x-Intervalle und y-Intervalle mit dieser Art von Formel finden:
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
Sie können noch einen Schritt weiter gehen und eine (vereinfachte) Interpolation der z-Werte grid
wie folgt durchführen:
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)
Welches gibt Ihnen diese Werte:
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
Beachten Sie, dass ix und iy auch mit einer Schleife gefunden werden könnten findInterval
, z. B. hier ein Beispiel für die zweite Zeile
findInterval(df$x[2], grid$x)
findInterval(df$y[2], grid$y)
Welche Spiele ix
und iy
indf[2]
Fußnote: (1) Das vierte Argument von vlookup hieß zuvor "match", wurde jedoch nach Einführung des Menübands in "[range_lookup]" umbenannt.