2012-04-15 11 views
6

yakın endeksi:R: bulmak Ben birkaç bin puanla iki vektörler, ama burada genelleştirilmiş

A <- c(10, 20, 30, 40, 50) 
b <- c(13, 17, 20) 

nasıl yakınb için olduğu A ait indicies alabilirim? Beklenen sonuç c(1, 2, 2) olacaktır.

Ben findInterval sadece en yakın ilk geçtiği bulabilir ve olamayacağını biliyorum ve which.min(abs(b[2] - A)) ısınıyor farkında değilim, ama her ikisi A uzun vektörler ile çalışacak şekilde vektörize anlamaya olamaz ve b.

cevap

11

Kodunuzu yalnızca bir sapply içine koyabilirsiniz. Bunun bir döngü için aynı hıza sahip olduğunu düşünüyorum, bu nedenle teknik olarak şu şekilde vektörelize edilmez:

sapply(b,function(x)which.min(abs(x - A))) 
+3

"which.min()" ifadesinin yalnızca ilk eşleşmeyi döndürdüğünü unutmayın. Eşit derecede yakın olan başka öğeler de olabilir. –

11

FindInterval sizi çok yaklaştırıyor. Sadece döndürür ofset diğeri arasındaki seçmek zorunda:

#returns the nearest occurence of x in vec 
nearest.vec <- function(x, vec) 
{ 
    smallCandidate <- findInterval(x, vec, all.inside=TRUE) 
    largeCandidate <- smallCandidate + 1 
    #nudge is TRUE if large candidate is nearer, FALSE otherwise 
    nudge <- 2 * x > vec[smallCandidate] + vec[largeCandidate] 
    return(smallCandidate + nudge) 
} 

nearest.vec(b,A) 

döner (1,2,2), ve performansta FindInterval için gereken karşılaştırılabilir.

+0

Gerçekten yararlı, teşekkürler. Bunu bazda yapacak bir şey olmadığına şaşıyorum. Muhtemelen var olduğunu ve bunun farkında değilim ...! – Flyto

0

Burada R'nin genellikle gözden kaçan outer işlevini kullanan bir çözüm var. Daha iyi performans göstereceğinden emin değil, ancak sapply'dan kaçınıyor.

A <- c(10, 20, 30, 40, 50) 
b <- c(13, 17, 20) 

dist <- abs(outer(A, b, '-')) 
result <- apply(dist, 2, which.min) 

# [1] 1 2 2 
İlgili konular