2016-09-24 16 views
0

Ich habe X-, Y- und Z-Koordinate von einer Hauptkomponentenanalyse, die ich eine euklidische Abstandsmatrix berechnen möchte.Berechne euklidische Abstandsmatrix von x, y, z Koordinaten

Testdaten:

    X   Y    Z 
samp_A -0.003467119 -0.01422762 -0.0101960126 
samp_B -0.007279433 0.01651597 0.0045558849 
samp_C -0.005392258 0.02149997 0.0177409387 
samp_D -0.017898802 0.02790659 0.0006487222 
samp_E -0.013564214 0.01835688 0.0008102952 
samp_F -0.013375397 0.02210725 -0.0286032185 

Ich würde letztlich eine Tabelle in folgendem Format zurückkehren möchten:

A B  ... 
A 0 0.2 ... 
B 0.2 0  ... 
... ... ... ... 
... ... ... ... 

Offensichtlich ist die Entfernung über Daten gefälscht. Die X-, Y- und Z-Daten sind einfach ein Kopf des gesamten Datensatzes. Der vollständige Datensatz besteht aus etwa 4000 Ganzzahlen. Ich nehme an, dass dies auf eine effiziente Art und Weise geschehen müsste. Wenn es einfacher ist, könnte die Berechnung der nächsten Entfernungen von beispielsweise 10 Punkten ausreichen (die restlichen Punkte wären NA oder 0).

Jede Hilfe wäre sehr willkommen!

EDIT: Ein Vorschlag entstand, um dist zu verwenden, aber ich glaube nicht, dass dies für drei Koordinaten zulassen. WENN ich dist verwenden, scheinen die Ergebnisse Unsinn (?) Zu sein.

> pca_coords_dist <- dist(pca_coords) 
> head(pca_coords_dist) 
[1] 0.03431210 0.04539427 0.04583855 0.03584466 0.04191922 0.04291657 

Ich glaube, einen Weg, um dies zu realisieren ist eine Funktion erstellen Entfernung zu berechnen, und es wird auf jede Zeile paar Weise an. I denke, das ist eine korrekte Funktion, Abstand in drei Dimensionen zu berechnen.

euc.dist.3 <- function(x1, x2, y1, y2, z1, z2) sqrt((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2) 

Wenn ich dies auf SampA und SampB anwende, ist das Ergebnis 1,56643.

Gibt es nun eine Möglichkeit, diese Funktion auf jede paarweise Zeile anzuwenden? und formatiere die Ausgabe in eine Distanzmatrix?

+0

'dist' ist, was Sie brauchen –

+0

Es ist mein Verständnis ist, dass' dist' nicht arbeite mit drei Koordinaten. Ich müsste eine Funktion paarweise auf jede Zeile anwenden. – user2117258

+0

Wenn Sie "euc.dist.3" für A und B eingeben, erhalten Sie 0,0343121. Do' euc.dist.3 (-0,003467119, -0,007279433, -0,01422762, 0,01651597, -0,0101960126, 0,0045558849) ' –

Antwort

4

versuchen ? dist in R:

distance.matrix <- dist(yourData, method = "euclidean", diag = T) 

In dem obigen Code, yourData ist Ihr data.frame oder Matrix

+0

Es ist ein 'data.frame' – user2117258

+0

Ich glaube nicht, dass' dist' drei Koordinaten unterstützt. Siehe oben Bearbeiten. – user2117258

+0

** dist ** eine Entfernungsmatrix, sagen wir ** dis.mat **, und ** dis.mat [i, j] ** gibt den Wert einer Art Abstand zwischen Ihrem ** data.frame * * _ith_ row und _jth_ row –

2

EDIT: dist(), wie angegeben durch Xiaotao Luo und Richard Telford arbeiten für 3D-Koordinaten. Tatsächlich liefert diese Antwort die gleichen Ergebnisse wie dist(). Also benutze dist() !!

Sie etwas Ähnliches wie this Antwort tun konnte:

Erste einen Index Matrix mit allen paarweise Zeilenkombinationen erstellen:

Verwendung:

x = matrix(runif(15),nrow = 5) 

      [,1]  [,2]  [,3] 
[1,] 0.1307924 0.94255848 0.55138616 
[2,] 0.7027617 0.11180608 0.73997077 
[3,] 0.5573857 0.64836253 0.11229408 
[4,] 0.4391854 0.04849022 0.93454137 
[5,] 0.5292623 0.19308569 0.00826927 

ind = t(combn(nrow(x), 2)) 

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

Dann fahren Sie mit dem 3D-Abstand für alle berechnen Diese Kombinationen verwenden:

distances = apply(ind, 1, function(z){ 
    sqrt(sum((x[z[1],] - x[z[2], ])^2)) 
}) 

die gibt:

> cbind(data.frame(ind), distances) 
    X1 X2 distances 
1 1 2 1.0260910 
2 1 3 0.6792164 
3 1 4 1.0204275 
4 1 5 1.0077022 
5 2 3 0.8384540 
6 2 4 0.3336751 
7 2 5 0.7563700 
8 3 4 1.0246505 
9 3 5 0.4678558 
10 4 5 0.9418077 

In Kürze:

ind = t(combn(nrow(x), 2)) 
distances = apply(ind, 1, function(z){ 
    sqrt(sum((x[z[1],] - x[z[2], ])^2)) 
}) 
result = cbind(data.frame(ind), distances) 

wobei x Matrix mit 3D-Koordinaten

Verwandte Themen