的海報並沒有問,如果exact=FALSE
查找值,但是我將其添加爲我自己的參考和其他可能的答案。
如果您正在查找分類值,請使用其他答案。
Excel的vlookup
也允許您匹配數值大致匹配與第四個參數(1)match=TRUE
。我想到match=TRUE
就像在溫度計上查看數值。默認值爲FALSE,對於分類值來說是完美的。
如果要近似匹配(執行查找),R有一個名爲findInterval
的函數,該函數(顧名思義)將查找包含連續數值的間隔/ bin。
但是,假設您想爲findInterval
取幾個值。你可以寫一個循環或使用一個應用函數。不過,我發現採用DIY矢量化方法更有效率。
比方說,你必須通過X和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)))
和你有一些值要通過x和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")
這裏例子可見:
contour(grid)
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)
,可以看到在x間隔和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
你可以把它一步,在grid
這樣執行在z值(簡單)插補:
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
請注意,也可以使用findInterval
例如findInterval
找到ix和iy。這裏是第二行
findInterval(df$x[2], grid$x)
# 4
findInterval(df$y[2], grid$y)
# 2
其中在比賽ix
和iy
一個例子df[2]
腳註: (1)VLOOKUP的第四個參數以前被稱爲「匹配」,但之後他們推出了緞帶被重新命名爲「[range_lookup]」。
我意識到這是相當晚,但感謝您的幫助。我嘗試了第一種和第二種方法。他們兩人都工作得很好。再次感謝您回答這個問題! – user2142810 2013-04-04 21:22:38
不客氣。如果它回答了您的問題,您可以通過點擊左上方箭頭下方的勾號來指明。這對有相同問題的人有幫助。 – Ben 2013-04-04 21:50:32
我認爲解決方案#2的工作原理僅僅是因爲在你的例子中,唯一的值恰巧是遞增順序的(=第一個唯一名稱是1,第二個唯一名稱是2等等)。如果你在第二行*'HousType = ECII'中添加'hous',HousTypeNo = '17',則查找全部錯誤。 – ECII 2013-12-09 18:43:20