2017-08-07 8 views
2

Ich möchte eine Funktion ausführen, die den Abstand zwischen den beiden Punkten angibt. Ich möchte die Entfernung zwischen allen Punkten berechnen, wie mache ich das. Ich verstehe, dass es mit if oder for getan werden kann, aber ich bin nicht großartig mit diesen verwenden.Entfernung zwischen einer Matrix von Punkten, einfache if & for's

Meine Funktion ist:

Distance<- function(x,y) { 
    round(sqrt(sum((x - y)^2)),3) 
} 

Ich habe 34 Punkte in Rechts- und Hochwert oder x & y der oben funtion:

easting=rbind(609027, 609282, 609501,609497,609405,609704,609718,610277,610530,610573,609875,608947,609865,611105,611169,611243,611388,611598,611339,611310,611212,611150,611358,611626,611763,611887,612043,612134,612160,612539,612857,613062,613154,613303) 
northing=rbind(1534293,1534470,1534630,1534848,1534027,1535054,1535315,1535583,1535717,1536254,1536351,1536700,1536746,1536762,1537003,1537261,1537489,1537685,1537838,1538103,1538500,1538812,1539217,1539342,1539627,1539842,1540027,1540357,1540628,1540911,1541623,1541896,1542117,1542494) 

Wenn coords<-as.data.frame(easting,northing) meine Daten-Set ist, dann möchte ich berechnen der Abstand zwischen coords[i,] und coords[j,]. Dabei sind i, j die Zeilen im Dataset.

Dank

Antwort

2

könnten Sie verwenden die dist Funktion:

df <- data.frame(easting=easting,northing = northing) 
dist(df) # or round(dist(df,upper=T,diag=T),3) 

Beispiel für die ersten drei Reihen:

round(dist(df[1:3,], upper=T,diag=T),3) 

     1  2  3 
1 0.000 310.409 581.588 
2 310.409 0.000 271.221 
3 581.588 271.221 0.000 

C Vergleich:

round(dist(df[1:3,]),3) 

     1  2 
2 310.409   
3 581.588 271.221 
+0

Das gibt mir 561 Werte, wenn ich alle 34 Zeilen verwende. Ich sollte 1156 bekommen. – SamAct

+1

Aus jeder Zeile können Sie die Entfernung zu 33 anderen Zeilen messen. '561 = (34 * 33)/2 '. Das ist also die Summe der einzigartigen Entfernungen. Wenn Sie '' round (dist (df, ober = T, diag = T), 3) 'anstelle von' dist (df) 'verwenden, erhalten Sie auch die Werte auf der Diagonalen und dem oberen Dreieck. Hoffe das klärt sich. – Florian

+0

Sie meinen, Rest des Wertes sind weggelassen? Es ist das Leerzeichen, das ich in den Ergebnissen sehe. – SamAct

2

aller Zuerst müssen Sie einige Details ändern, wie Sie Ihre data.frame erstellen. Statt die Vektoren und northing mit cbind zu definieren, verwenden Sie c. Verwenden Sie dann data.frame, nicht as.data.frame.

easting = c(609027, 609282, 609501,609497,609405,609704,609718,610277,610530,610573,609875,608947,609865,611105,611169,611243,611388,611598,611339,611310,611212,611150,611358,611626,611763,611887,612043,612134,612160,612539,612857,613062,613154,613303) 
northing = c(1534293,1534470,1534630,1534848,1534027,1535054,1535315,1535583,1535717,1536254,1536351,1536700,1536746,1536762,1537003,1537261,1537489,1537685,1537838,1538103,1538500,1538812,1539217,1539342,1539627,1539842,1540027,1540357,1540628,1540911,1541623,1541896,1542117,1542494) 
coords <- data.frame(easting, northing) 

Nun, um Funktion zu nutzen apply Sie müssen auch Ihre Funktion ändern, haben sie einen Vektor als Argument akzeptieren.

Distance<- function(x, y) { 
    round(sqrt(sum((x - y)^2)),3) 
} 

und verwenden eine verschachtelte for Schleife

d <- numeric(34^2) 
k <- 0 
for(i in seq_len(nrow(coords))) 
    for(j in seq_len(nrow(coords))){ 
     k <- k + 1 
     d[k] <- Distance(coords[i, ], coords[j, ]) 
    } 
+0

Wäre das nicht nur 34 Entfernungen anstatt alle 34^2 Entfernungen berechnen? Sie könnten vielleicht 'expand.grid()' verwenden. In jedem Fall - die Spalten enthalten nur einzelne Zahlen und keine Punkte. –

+0

@JohnColeman OK, jetzt habe ich Florian's Antwort gesehen. Ich werde meine bearbeiten. –

+0

Das Problem besteht immer noch darin, dass Sie tatsächlich den absoluten Wert zwischen den Koordinaten "x" von einigen Punkten und "y" Koordinaten von anderen im Gegensatz zur Berechnung der Entfernung zwischen Punkten berechnen. 'easting' sind die x-Koordinaten und' northing' die y. Die Berechnung der Entfernung zwischen einem Element von "Hochwert" und einem Element von "Hochwert" ist nicht wirklich sinnvoll. –

Verwandte Themen