2015-09-16 37 views
6

Sto appena iniziando a imparare R ma vorrei che il progetto fosse fatto prima piuttosto che dopo. È piuttosto semplice: ho una colonna X e una colonna Y composta da coordinate X e coordinate Y. (Lavorare nel sistema di coordinate NAD27). Andando dalla prima coordinata, mi piacerebbe trovare il punto più vicino all'interno del set di dati e quindi passare alla coordinata successiva e trovare il punto più vicino all'interno dello stesso set di dati. Idealmente, passerebbe attraverso ogni punto e determinerà il punto più vicino.Trova la coordinata X, Y più vicina usando R

point x   y 
1  1601774 14544454 
2  1616574 14579422 
3  1608698 14572922 
4  1602948 14572990 
5  1607355 14573871 
6  1615336 14578178 
7  1603398 14574495 
8  1605153 14570727 
9  1606758 14573845 
10 1606655 14570953 
+3

Benvenuti in Stack Overflow! Per favore includi un piccolo set di dati campione (non ho familiarità con il sistema di coordinate NAD27 e assumerei che anche altri potrebbero esserlo). Inoltre, includi qualsiasi codice che hai provato a eseguire questa operazione. – josliber

+0

Perché i punti negativi? Ottima domanda. Chiedigli di modificare la domanda. – Soheil

+4

'sp :: spDists' o' rgeos :: gDistance' dovrebbe essere d'aiuto, ma prima devi provare alcune cose (la gente non sta solo andando a scrivere il codice) – hrbrmstr

risposta

7

Ecco un modo, utilizzando il pacchetto RANN. L'approccio è simile a quello mostrato in this post, ma è adattato per un singolo insieme di punti (il post collegato riguardava la ricerca del punto più vicino nell'insieme A in ogni punto dell'insieme B).

xy <- read.table(text='point x   y 
1  1601774 14544454 
2  1616574 14579422 
3  1608698 14572922 
4  1602948 14572990 
5  1607355 14573871 
6  1615336 14578178 
7  1603398 14574495 
8  1605153 14570727 
9  1606758 14573845 
10 1606655 14570953', header=TRUE, row.names=1) 

library(RANN) 
closest <- nn2(data=xy, k=2)[[1]] 

Sopra, forniamo il set unico di punti, xy, all'argomento data, e specificare che vogliamo nn2 di trovare le due punti più vicini ad ogni punto (perché il punto più vicino è il punto focale si). La funzione nn2 restituisce una lista con due elementi: un vettore (matrice, in questo caso) di indici di ciascuno dei punti k più vicini (per ciascun punto interrogato); e un vettore (matrice) delle distanze. Suppongo che non ci interessino le distanze, quindi sopra riportiamo il risultato al primo elemento.

Per il nostro problema, il risultato è una matrice a due colonne che fornisce l'indice del punto interrogato nella prima colonna e l'indice del punto più vicino nel secondo.

closest 

##  [,1] [,2] 
## [1,] 1 8 
## [2,] 2 6 
## [3,] 3 5 
## [4,] 4 7 
## [5,] 5 9 
## [6,] 6 2 
## [7,] 7 4 
## [8,] 8 10 
## [9,] 9 5 
## [10,] 10 8 

Per ottenere una matrice di coordinate dei punti più vicini, è possibile utilizzare:

xy[closest[, 2], ] 

Per impostazione predefinita nn2 utilizza un albero kd - si potrebbe desiderare di sperimentare con treetype='bd'.

+0

Sembra fantastico.Per essere certo di comprendere correttamente, il punto più vicino per coordinare 1 è la coordinata 8? E con la coordinata 2, è la coordinata 6, ecc.? – jhenson

+0

@jhenson - è corretto (beh, il punto più vicino a coord 1 è coord 1, e il secondo più vicino è 8, ma sì, ottieni l'immagine) – jbaums

+0

Giusto! Grazie mille, sta funzionando benissimo con i miei dati fino ad ora. – jhenson