Người đăng không hỏi về việc tra cứu các giá trị nếu exact=FALSE
, nhưng tôi thêm điều này như một câu trả lời để tham khảo cho riêng tôi và có thể những người khác.
Nếu bạn đang tìm kiếm các giá trị phân loại, hãy sử dụng các câu trả lời khác.
Excel vlookup
cũng cho phép bạn so khớp khớp gần đúng cho các giá trị số với đối số thứ 4 (1) match=TRUE
. Tôi nghĩ vềmatch=TRUE
giống như tra cứu các giá trị trên nhiệt kế. Giá trị mặc định là FALSE, hoàn hảo cho các giá trị phân loại.
Nếu bạn muốn so khớp gần đúng (thực hiện tra cứu), R có một hàm được gọi findInterval
, hàm này (như tên của nó) sẽ tìm khoảng / bin chứa giá trị số liên tục của bạn.
Tuy nhiên, giả sử rằng bạn muốn findInterval
một số giá trị. Bạn có thể viết một vòng lặp hoặc sử dụng một hàm áp dụng. Tuy nhiên, tôi thấy việc áp dụng phương pháp vector hóa DIY sẽ hiệu quả hơn.
Giả sử bạn có một lưới các giá trị được lập chỉ mục bởi x và 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)))
và bạn có một số giá trị bạn muốn tra cứu theo x và 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")
Đây là ví dụ được hình dung:
contour(grid)
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)
Bạn có thể tìm khoảng x và khoảng y bằng loại công thức sau:
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
Bạn có thể tiến thêm một bước nữa và thực hiện phép nội suy (đơn giản) trên các giá trị z grid
như sau:
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)
Điều này mang lại cho bạn những giá trị sau:
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
Lưu ý rằng ix và iy cũng có thể được tìm thấy với một vòng lặp bằng cách sử dụng findInterval
, ví dụ: đây là một ví dụ cho hàng thứ hai
findInterval(df$x[2], grid$x)
findInterval(df$y[2], grid$y)
Phù hợp ix
và iy
trongdf[2]
Chú thích cuối trang: (1) Đối số thứ tư của vlookup trước đây được gọi là "match", nhưng sau khi họ giới thiệu dải băng, nó được đổi tên thành "[range_lookup]".