2013-01-16 12 views
8

UtentiTrova indici di 5 campioni più vicini nella matrice di distanza

Ho una matrice di distanza dMat e voglio trovare i 5 campioni più vicini al primo. Quale funzione posso usare in R? So come trovare il campione più vicino (vedere la terza riga di codice), ma non riesco a capire come ottenere gli altri 4 campioni.

Il codice:

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

La terza riga di codice trova l'indice del campione più vicino al primo campione.

Grazie per qualsiasi aiuto!

migliore, Chega

risposta

6

È possibile utilizzare order per fare questo:

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

Si noti che ho rimosso il primo, come lei probabilmente non si vuole includere il fatto che il vostro punto di riferimento è a 0 distanza da se stesso.

+0

Grazie per questa risposta rapida! Consentitemi una domanda: capisco "ordine" e "testa", ma qual è lo scopo dell'ultimo termine "+1"? – Chega

+0

Va bene, ho capito, molte grazie per questo! – Chega

5

alternativo utilizzando sort:

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

Sarebbe bello aggiungere un set.seed(.) quando si utilizza random numbers nella matrice in modo da poter mostrare i risultati sono identici. Salterò i risultati qui.

Edit (soluzione corretta): Questa soluzione funziona solo se il primo elemento è sempre il più piccolo! Ecco la soluzione corretta che darà sempre i 5 valori più vicini al primo elemento della colonna:

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

Esempio:

> 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

Grazie - anche per il suggerimento con set.seed() - ha assolutamente senso! – Chega

+0

Un'altra alternativa per il caso generale è quella di restituire gli indici più n + 1 e rimuovere il primo, cioè 'head (ordine (dMat [, 1]), 6) [- 1]' – James

+1

@Arun Ah sì, questo sarebbe solo funziona se per la colonna n vuoi fare riferimento all'elemento n. Ma questo è ciò che la matrice della distanza tornerebbe. – James

Problemi correlati