2012-05-22 2 views
6

die MatrixWie kann ich eine Entfernungsmatrix erstellen, die die mittleren absoluten Werte zwischen jeder Zeile enthält?

 X1 X2 X3 X4 X5 
[1,] 1 2 3 2 1 
[2,] 2 3 4 4 3 
[3,] 3 4 4 6 2 
[4,] 4 5 5 5 4 
[5,] 2 3 3 3 6 
[6,] 5 6 2 8 4 

Ich mag Bei einer Abstandsmatrix, welche die absolute mittlere Differenz zwischen jeder Zeile jeder Spalte zu erzeugen. Zum Beispiel sollte der Abstand zwischen X1 und X3 = 1,67 sein, vorausgesetzt, dass:

abs (1 - 3) + abs (2-4) + abs (3-4) + abs (4-5) + abs (2-3) + abs (5-2) = 10/6 = 1,67.

I versucht haben, die in der Funktion designdist vegan Paket mit auf diese Weise:

designdist(t(test), method = "abs(A-B)/6", terms = "minimum") 

Die sich ergebende Entfernung für die Spalten 1 und 3 ist 0,666. Das Problem mit dieser Funktion ist, dass sie alle Werte in jeder Spalte summiert und dann subtrahiert. Aber ich muss die absoluten Unterschiede zwischen jeder Zeile (einzeln, absolut) summieren und dann durch N teilen.

Antwort

5

Hier ist eine One-Line-Lösung. Es nutzt dist() 's method Argument, um die L1 norm aka city block distance aka Manhattan distance zwischen jedem Spaltenpaar in Ihrem data.frame zu berechnen.

as.matrix(dist(df, "manhattan", diag=TRUE, upper=TRUE)/nrow(df)) 

Um es reproduzierbar zu machen:

df <- read.table(text=" 
X1 X2 X3 X4 X5 
    1 2 3 2 1 
    2 3 4 4 3 
    3 4 4 6 2 
    4 5 5 5 4 
    2 3 3 3 6 
    5 6 2 8 4", header=T) 

dmat <- as.matrix(dist(df, "manhattan", diag=TRUE, upper=TRUE)/nrow(df)) 
print(dmat, digits=3) 
#  1  2  3 4  5 6 
# 1 0.00 1.167 1.667 2.33 1.333 3.00 
# 2 1.17 0.000 0.833 1.17 0.833 2.17 
# 3 1.67 0.833 0.000 1.00 1.667 1.67 
# 4 2.33 1.167 1.000 0.00 1.667 1.33 
# 5 1.33 0.833 1.667 1.67 0.000 2.33 
# 6 3.00 2.167 1.667 1.33 2.333 0.00 
+0

Es schön gearbeitet! Vielen Dank! – Werner