2017-10-26 10 views
0

Ähnlich wie previous post muss ich einen Attributvektor in eine Matrix umwandeln. Diesmal mit Unterschieden zwischen Elementpaaren unter Verwendung von R.Attributvektor in eine Matrix mit Differenzen von Elementen transformieren

Zum Beispiel habe ich einen Vektor, der das Alter von N Personen (von 18 bis 90 Jahren) meldet. Ich muss diesen Vektor in eine NxN-Matrix namens A (mit Personennamen in Zeilen und Spalten) umwandeln, wobei jede Zelle Aij den Wert | age_i-age_j | hat, der die absolute Altersdifferenz zwischen den beiden Personen i und j darstellt. Hier

ist ein Beispiel mit 3 Personen, erst 18 yo, zweit 23 yo, dritt 60 yo, die diesen Vektor zu produzieren:

c(18, 23, 60) 

Ich mag sie in diese Matrix zu transformieren:

A = matrix(c(0, 5, 42, 5, 0, 37, 42, 37, 0), nrow=3, ncol=3, byrow = TRUE) 

Antwort

1
tmp <- c(18, 23, 60) 

Sie können dist verwenden, um mit ein paar Argumente:

dist(tmp, upper=TRUE, diag=TRUE) 
    1 2 3 
1 0 5 42 
2 5 0 37 
3 42 37 0 

Beachten Sie, dass die dist-Funktion ein "dist" -Objekt zurückgibt, also möchten Sie es möglicherweise mit as.matrix zu einer Matrix zwingen. Dann können Sie die Argumente fallen:

as.matrix(dist(tmp)) 
    1 2 3 
1 0 5 42 
2 5 0 37 
3 42 37 0 

Oder wieder outer verwenden. Füge den Subtraktionsoperator ein und nimm den absoluten Wert.

abs(outer(tmp, tmp, "-")) 

    [,1] [,2] [,3] 
[1,] 0 5 42 
[2,] 5 0 37 
[3,] 42 37 0 

Vermutlich wird dist schneller sein als outer, da der Algorithmus Vorteil der Symmetrie nehmen können, die in solchen Berechnung ist, während outer allgemeiner ist.

+0

Ich frage mich auch, ob es eine einfache Möglichkeit gibt, das Gegenteil zu tun: Transformieren Sie eine Matrix von Entfernungen in ein Attribut-Array. Gibt es einen umgekehrten Befehl für äußere? – Forinstance

+0

Ich kann mir nichts aus dem Kopf denken. Dies könnte es wert sein, in einer separaten Frage zu fragen. Wenn Sie dies tun, sollten Sie ein reproduzierbares Beispiel einfügen. – lmo

Verwandte Themen