2016-12-29 4 views
0

Ich mag eine Adjazenzmatrix schaffen, in sozialer Netzwerkanalyse (wahrscheinlich mit graph_from_adjacency_matrix in IGRAPH) aus einer CSV zu verwenden, wie diese strukturiert ist (aber viel größer):erstellen Adjazenzmatrix für SNA von Datenrahmen

name vote1 vote2 vote3 
Joe 1  0  1 
Jane 0  0  1 
Jill 1  0  1 

Für die Netzwerkanalyse ist der Knoten die Namensvariable und die Knoten werden durch die Häufigkeit der Abstimmung miteinander verbunden (1 oder 0). Etwas wie:

Joe Jane Jill 
Joe 0 2 3 
Jane 2 0 2 
Jill 3 2 0 

So einfach, wie dies scheint, ich habe es nicht gelungen, erfolgreich diesen Datenrahmen in eine Adjazenzmatrix zu konvertieren, die verwendet werden können, ein IGRAPH Graph-Objekt zu erstellen. as.matrix und data.matrix konvertieren es in eine Matrix, aber keine Adjazenzmatrix, und nicht eine, die die Zeichen in der Variable "name" beibehält. Meine Matrixalgebra ist nicht stark, also weiß ich, dass ich wahrscheinlich etwas Offensichtliches vermisse, aber ich weiß nicht genug, um zu wissen, was es ist. Ich bin offen für andere Lösungen, die mich zu meinem Endziel der Netzwerkanalyse bringen.

Antwort

4

Ich denke, Sie möchten eine Version des Cross-Produkts.

# construct the matrix 
myMat <- as.matrix(df[-1]) 

# same output as myMat %*% t(myMat) 
resultMat <- tcrossprod(myMat) 
# add names 
dimnames(resultMat) <- list(df$name, df$name) 

resultMat 
    Joe Jane Jill 
Joe 2 1 2 
Jane 1 1 1 
Jill 2 1 2 

Die Diagonal zeigt die Grafen von Fällen, in denen die Individuen zugleich abgestimmt und die Diagonale gibt die zählt, wie oft die Individuen mit sich selbst gewählt (dh ihre Gesamtstimmenauszählung).

Da Sie nicht die Gesamtzahl der Stimmen jeder Person möchten, können Sie die Diagonale durch 0s ersetzen.

# remove diagonal 
diag(resultMat) <- 0 

resultMat 
    Joe Jane Jill 
Joe 0 1 2 
Jane 1 0 1 
Jill 2 1 0 

zwei zusätzliche Stimmen und zwei zusätzliche Wähler in df1 unter Hinzufügen. Es gibt einen Wähler namens Sal, der nur einmal in der Stimme 2 abstimmt und der einzige Wähler ist.

df1 
name vote1 vote2 vote3 vote4 vote5 
1 Joe  1  0  1  0  1 
2 Jane  0  0  1  1  0 
3 Jill  1  0  1  1  0 
4 Bob  1  0  1  1  0 
5 Sal  0  1  0  0  0 

Laufen durch das obige Verfahren mit dieser größeren Matrix erhalten wir

resultMat 
    Joe Jane Jill Bob Sal 
Joe 0 1 2 2 0 
Jane 1 0 2 2 0 
Jill 2 2 0 3 0 
Bob 2 2 3 0 0 
Sal 0 0 0 0 0 

Welche 0s in allen Sals Slots und 3s in Bob-Jill Jill-Bob Schlitze zeigt, wie sie beide in der Abstimmung gleich 3 Stimmen.

Daten

df <- 
structure(list(name = structure(c(3L, 1L, 2L), .Label = c("Jane", 
"Jill", "Joe"), class = "factor"), vote1 = c(1L, 0L, 1L), vote2 = c(0L, 
0L, 0L), vote3 = c(1L, 1L, 1L)), .Names = c("name", "vote1", 
"vote2", "vote3"), class = "data.frame", row.names = c(NA, -3L)) 

df1 <- 
structure(list(name = structure(c(4L, 2L, 3L, 1L, 5L), .Label = c("Bob", 
"Jane", "Jill", "Joe", "Sal"), class = "factor"), vote1 = c(1L, 
0L, 1L, 1L, 0L), vote2 = c(0L, 0L, 0L, 0L, 1L), vote3 = c(1L, 
1L, 1L, 1L, 0L), vote4 = c(0L, 1L, 1L, 1L, 0L), vote5 = c(1L, 
0L, 0L, 0L, 0L)), .Names = c("name", "vote1", "vote2", "vote3", 
"vote4", "vote5"), class = "data.frame", row.names = c(NA, -5L)) 
+0

Das war genau das, was ich brauchte. Ich habe am Ende "data.matrix" statt "as.matrix" verwendet, aber das ist die einzige Modifikation. –

+0

Schön. Ich habe diese Funktion vergessen. Guter Fund. – lmo

Verwandte Themen