포스터는 값을 찾는 것에 대해 묻지 exact=FALSE
않았지만 내 자신과 다른 사람들에 대한 답변으로 이것을 추가하고 있습니다.
범주 형 값을 찾는 경우 다른 답변을 사용하십시오.
Excel vlookup
에서는 4 번째 인수 (1)를 사용하여 숫자 값에 대해 대략적으로 일치시킬 수 있습니다 match=TRUE
. 내 생각 엔match=TRUE
온도계에서 값을 찾는 것과 같다고 합니다. 기본값은 FALSE이며 범주 형 값에 적합합니다.
대략적으로 일치시키려는 경우 (조회 수행) R에는이라는 함수가 있으며 findInterval
, 이는 이름에서 알 수 있듯이 연속 숫자 값을 포함하는 간격 / 빈을 찾습니다.
그러나 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
ix 및 iy는를 사용하는 루프에서도 찾을 수 있습니다. findInterval
예를 들어 두 번째 행에 대한 한 가지 예가 있습니다.
findInterval(df$x[2], grid$x)
findInterval(df$y[2], grid$y)
어떤 경기 ix
와 iy
의df[2]
각주 : (1) vlookup의 네 번째 인수는 이전에 "일치"라고 불렸지만 리본을 도입 한 후에는 "[range_lookup]"으로 이름이 변경되었습니다.