Poster, değerlere bakmayı sormadı exact=FALSE
, ancak bunu kendi referansım ve muhtemelen başkaları için bir cevap olarak ekliyorum.
Kategorik değerler arıyorsanız, diğer cevapları kullanın.
Excel'in vlookup
ayrıca sayısal değerleri yaklaşık olarak 4. bağımsız değişkenle (1) eşleştirmenize izin verir match=TRUE
. match=TRUE
Bir termometrede değerlere bakmayı düşünüyorum . Varsayılan değer YANLIŞ'tır ve kategorik değerler için mükemmeldir.
Yaklaşık olarak eşleştirmek istiyorsanız (bir arama yapın), R'nin findInterval
(adından da anlaşılacağı gibi) sürekli sayısal değerinizi içeren aralığı / bin'i bulacak adlı bir işlevi vardır .
Ancak, findInterval
birkaç değer için istediğinizi varsayalım. Bir döngü yazabilir veya uygulama işlevi kullanabilirsiniz. Bununla birlikte, DIY vektörleştirilmiş bir yaklaşım benimsemeyi daha verimli buldum.
Diyelim ki x ve y tarafından indekslenmiş bir değerler ızgaranız var:
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)))
ve x ve y'ye göre aramak istediğiniz bazı değerlere sahipsiniz:
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")
İşte görselleştirilmiş örnek:
contour(grid)
points(df$x, df$y, pch=df$id, col="blue", cex=1.2)
Bu tür formülle x aralıklarını ve y aralıklarını bulabilirsiniz:
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
Bunu bir adım daha ileri götürebilir ve aşağıdaki grid
gibi z değerleri üzerinde (basit) bir enterpolasyon yapabilirsiniz :
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)
Bu size şu değerleri verir:
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 ve iy'in bir döngü kullanılarak da bulunabileceğine dikkat edin findInterval
, örneğin burada ikinci satır için bir örnek var
findInterval(df$x[2], grid$x)
findInterval(df$y[2], grid$y)
Hangi maçlarda ix
ve iy
içindedf[2]
Dipnot: (1) vlookup'ın dördüncü argümanı daha önce "eşleşme" olarak adlandırılıyordu, ancak şeridi tanıttıktan sonra "[aralık_bak]" olarak yeniden adlandırıldı.