2013-01-16 13 views
8

UżytkownicyZnajdź indeksy 5 najbliższych próbek w macierzy odległości

Mam matrycę odległości dMat i chcę znaleźć 5 najbliższych próbek do pierwszej. Jaką funkcję mogę użyć w R? Wiem, jak znaleźć najbliższą próbkę (por. Trzecia linia kodu), ale nie mogę wymyślić, jak uzyskać pozostałe 4 próbki.

Kod:

Mat <- replicate(10, rnorm(10)) 
dMat <- as.matrix(dist(Mat)) 
which(dMat[,1]==min(dMat[,1])) 

3rd linii kodu znajduje indeks próbki do najbliższego pierwszej próbce.

Dzięki za pomoc!

Best, Chega

Odpowiedz

6

Można użyć order to zrobić:

head(order(dMat[-1,1]),5)+1 
[1] 10 3 4 8 6 

Zauważ, że usunąłem pierwszy, jak przypuszczalnie nie chcą uwzględniać fakt, że punktem odniesienia znajduje się w odległości 0 od siebie.

+0

Dzięki za to szybką odpowiedź! Pozwól mi jedno pytanie: rozumiem "porządek" i "głowa", ale jaki jest cel ostatniego słowa "+1"? – Chega

+0

Dobra, mam to, wielkie dzięki za to! – Chega

5

alternatywna użyciu sort:

sort(dMat[,1], index.return = TRUE)$ix[1:6] 

Byłoby miło, aby dodać set.seed(.) podczas korzystania random numbers w matrycy tak, że mogliśmy pokazać wyniki są identyczne. Pomijam wyniki tutaj.

Edit (poprawne rozwiązanie): Powyższe rozwiązanie będzie działać tylko wtedy, gdy pierwszy element jest zawsze najmniejszy! Oto poprawne rozwiązanie, które zawsze dadzą 5 najbliższych wartości do pierwszego elementu kolumny:

> sort(abs(dMat[-1,1] - dMat[1,1]), index.return=TRUE)$ix[1:5] + 1 

Przykład:

> dMat <- matrix(c(70,4,2,1,6,80,90,100,3), ncol=1) 
# James' solution 
> head(order(dMat[-1,1]),5) + 1 
[1] 4 3 9 2 5 # values are 1,2,3,4,6 (wrong) 
# old sort solution 
> sort(dMat[,1], index.return = TRUE)$ix[1:6] 
[1] 4 3 9 2 5 1 # values are 1,2,3,4,6,70 (wrong) 
# Correct solution 
> sort(abs(dMat[-1,1] - dMat[1,1]), index.return=TRUE)$ix[1:5] + 1 
[1] 6 7 8 5 2 # values are 80,90,100,6,4 (right) 
+0

Dzięki - również dla podpowiedzi z set.seed() - ma to absolutnie sens! – Chega

+0

Inną alternatywą dla ogólnego przypadku jest zwrócenie n + 1 najbliższych indeksów i usunięcie pierwszego, tj. 'Head (order (dMat [, 1]), 6) [- 1]' – James

+1

@Arun Ah tak, to by tylko działa, jeśli dla kolumny n chcesz odwołać się do elementu n. Ale to właśnie powróci matryca odległości. – James

Powiązane problemy