Плакат не просил о поиске значения, если exact=FALSE
, но я добавляю это как ответ для своих собственных ссылок и, возможно, других.
Если вы ищете категориальные значения, используйте другие ответы.
Excel vlookup
также позволяет сопоставлять соответствие приблизительно для числовых значений с помощью 4-го аргумента (1) match=TRUE
. Я думаю о match=TRUE
как поиск значений на термометре. Значение по умолчанию - FALSE, которое идеально подходит для категориальных значений.
Если вы хотите совместить приблизительно (выполнить поиск), R имеет функцию, называемую findInterval
, которая (как следует из названия) найдет интервал/бит, который содержит ваше непрерывное числовое значение.
Однако предположим, что вы хотите получить findInterval
для нескольких значений. Вы можете написать цикл или использовать функцию apply. Тем не менее, я счел более эффективным использовать подход, основанный на DIY.
Давайте предположим, что у вас есть сетка значений, проиндексированных по х и у:
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)))
и у вас есть некоторые значения, которые вы хотите посмотреть на х и у:
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)
Вы можете найти интервалы х и у интервалов с этим типом формулы:
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
как это:
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
# 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
Обратите внимание, что ix и iy также могут быть найдены с помощью петли с использованием findInterval
, например. вот один пример для второго ряда
findInterval(df$x[2], grid$x)
# 4
findInterval(df$y[2], grid$y)
# 2
Какие матчи ix
и iy
в df[2]
Сноска: (1) Четвертый аргумент ВПР ранее назывался «Матч», но после того, как они представили ленту он было переименовано в «[range_lookup]».
Я понял, что это довольно поздно, но спасибо за вашу помощь. Я попробовал как первый, так и второй метод. Оба они хорошо работали. Опять же, спасибо за ответ на вопрос! – user2142810
Добро пожаловать. Если он ответил на ваш вопрос, вы можете указать это, нажав на галочку под стрелками в верхнем левом углу. Это будет полезно для других, у кого есть тот же вопрос. – Ben
Я думаю, что решение №2 работает только потому, что в вашем примере уникальные значения оказываются в порядке возрастания (= первое уникальное имя - 1 второе уникальное имя - 2 и т. Д.). Если вы добавите в 'hous', скажем, в * второй строке * 'HousType = ECII', HousTypeNo = '17 ', поиск идет не так. – ECII