2016-06-02 21 views
1

Ich versuche eine Adjazenzmatrix M aus einer Liste pList zu erstellen, die die Indizes enthält, die in der Matrix M gleich 1 sein müssen. Zum Beispiel ist M eine 10x5 Matrix Die Variable pList enthält 5 Elemente, die jeweils einen Vektor von Indizes istR Populate Matrix mit einer Liste von Indizes

Beispiel:

s <- list("1210", c("254", "534"), "254", "534", "364") 
M <- matrix(c(rep(0)),nrow = 5, ncol = length(unique(unlist(s))), dimnames=list(1:5,unique(unlist(s)))) 

Eigentlich meine zu einfache Lösung ist, die brutale eine mit einem zur Schleife über Zeilen der Matrix:

for (i in 1:nrow(M)){ 
     M[i, as.character(s[[i]])] <- 1 
} 
So

, dass das erwartete Ergebnis:

M 
    1210 254 534 364 
1 1 0 0 0 
2 0 1 1 0 
3 0 1 0 0 
4 0 0 1 0 
5 0 0 0 1 

Das Problem ist, dass ich Matrizen mit mehreren tausend Zeilen zu manipulieren, und es dauert zu lange. Ich bin kein Experte „anwenden“, aber ich frage mich, ob es eine schnellere Lösung

ist

Dank

Grüße

Antwort

2

Wir haben die list auf einen matrix von row/column Index umwandeln kann, verwenden Sie diesen Index der zuweisen Elemente in 'M' zu 1.

M[as.matrix(stack(setNames(s, seq_along(s)))[,2:1])] <- 1 
M 
# 1210 254 534 364 
#1 1 0 0 0 
#2 0 1 1 0 
#3 0 1 0 0 
#4 0 0 1 0 
#5 0 0 0 1 

Oder statt stack zu einem data.frame konvertieren zu verwenden, können wir unlist das ‚S‘ den Spaltenindex zu erhalten, cbind mit Zeilenindex durch Replizieren der Sequenz von list mit length jedes list Element (unter Verwendung von lengths) und weisen die Elemente in ‚M‘ auf 1

erstellt
M[cbind(rep(seq_along(s), lengths(s)), unlist(s))] <- 1 

Oder doch wäre eine andere Möglichkeit, eine sparseMatrix

library(Matrix) 
Un1 <- unlist(s) 
sparseMatrix(i = rep(seq_along(s), lengths(s)), 
      j=as.integer(factor(Un1, levels = unique(Un1))), 
      x=1) 
erstellen sein
Verwandte Themen