2017-07-25 5 views
4

Angenommen, ich einen Vektor haben, die wie folgt aussieht:eine binäre Adjazenzmatrix von einem Vektor der Indizes

x <- sample(5, 500, replace = TRUE) 

so dass jedes Element zu einem gewissen Index von 1 bis 5

entspricht Was ist ein effizienter Möglichkeit, aus diesem Vektor eine binäre Adjazenzmatrix zu erstellen? Um dies auszuarbeiten, sollte die Matrix A so sein, dass A[i,j] = 1 wenn x[i] = x[j] und 0 andernfalls.

Antwort

7

In einer Zeile können Sie

outer(x, x, function(x, y) as.integer(x==y)) 

tun, die

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

oder in zwei Linien gibt

myMat <- outer(x, x, "==") 
myMat[] <- as.integer(myMat) 

Sie sicher, dass sie das gleiche sind.

identical(myMat, outer(x, x, function(x, y) as.integer(x==y))) 
[1] TRUE 

Daten

set.seed(1234) 
x <- sample(5, 10, replace = TRUE) 
+1

Vielleicht auch 'sapply (seq_along (x), Funktion (i) sapply (seq_along (x), Funktion (j) as.integer (x [i] = = x [j]))) ' –

Verwandte Themen