2016-05-03 16 views
3

Ich möchte eine Matrix erstellen, die die Gruppenmitgliedschaft aus einem Datenrahmen angibt. Zum Beispiel eine NxN-Matrix, wobei 1 bedeutet, dass eine Nachbarschaft innerhalb der gleichen Stadt wie eine andere Nachbarschaft liegt und 0 bedeutet, dass die Nachbarschaften Teil einer anderen Stadt sind. Zum Beispiel:Erstellen einer Matrix basierend auf der Gruppenmitgliedschaft

hoodid <- c(1:10) 
cityid <- c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3) 
df <- data.frame(hoodid, cityid) 
df 

# hoodid cityid 
# 1  1  1 
# 2  2  1 
# 3  3  1 
# 4  4  2 
# 5  5  2 
# 6  6  3 
# 7  7  3 
# 8  8  3 
# 9  9  3 
# 10  10  3 

Das gewünschte Ergebnis ist:

# 0 1 1 0 0 0 0 0 0 0 
# 1 0 1 0 0 0 0 0 0 0 
# 1 1 0 0 0 0 0 0 0 0 
# 0 0 0 0 1 0 0 0 0 0 
# 0 0 0 1 0 0 0 0 0 0 
# 0 0 0 0 0 0 1 1 1 1 
# 0 0 0 0 0 1 0 1 1 1 
# 0 0 0 0 0 1 1 0 1 1 
# 0 0 0 0 0 1 1 1 0 1 
# 0 0 0 0 0 1 1 1 1 0 
+1

Vielleicht interessieren Sie sich ja auch für das für diese Art von Dingen entworfene igraph-Paket – Frank

+0

Können Sie noch einen Hinweis geben, welcher Teil von igraph helfen würde? – bcrew

+0

'from_adjacency' wird Ihre Adjazenzmatrix in eine Grafik umwandeln. Von dort können Sie die Graphalgorithmen nutzen, die normalerweise für die Analyse solcher Daten verwendet werden. – Frank

Antwort

5

Dies funktioniert:

library(Matrix) 
m = do.call(bdiag, lapply(
    lengths(split(df$cityid, df$cityid)), 
    function(n) 1 - diag(n) 
)) 

# 10 x 10 sparse Matrix of class "dgCMatrix" 
#       
# [1,] . 1 1 . . . . . . . 
# [2,] 1 . 1 . . . . . . . 
# [3,] 1 1 . . . . . . . . 
# [4,] . . . . 1 . . . . . 
# [5,] . . . 1 . . . . . . 
# [6,] . . . . . . 1 1 1 1 
# [7,] . . . . . 1 . 1 1 1 
# [8,] . . . . . 1 1 . 1 1 
# [9,] . . . . . 1 1 1 . 1 
# [10,] . . . . . 1 1 1 1 . 

Dies setzt voraus, dass Ihre Daten von cityid zuerst sortiert wird und keine Duplikate oder jede andere Kuriositäten.

Sie können as.matrix(m), wenn Sie eine Vanille-Matrix möchten.

+1

Ausgezeichnet. Das ist richtig, wenn man zuerst die Sortierung auf cityid (die Gruppenvariable) annimmt. Vielen Dank! – bcrew

Verwandte Themen