2016-06-09 5 views
0

Ich habe folgendes Netzwerk in R des Knoten zusammen:Mapping in R von großer ganzer Zahl zu kleinen ganzen Zahlen

"39336" "19054" "32644" "52356" "14095" "18221" "12237" "61278" "34703" "15780" "33148" "54104" "5816" "92819" "4" 

und die folgende Liste alle Pfade beschrieben, die an dem Knoten enden ‚4‘

p 
[[1]] 
[1] 52356 61278 19054 15780 19054 61278 19054 

[[2]] 
[1] 15780 19054 32644 14095 12237 19054 14095 

[[3]] 
[1] 32644 15780 19054 32644 12237 19054 

[[4]] 
[1] 19054 52356 

[[5]] 
[1] 19054 15780 19054 52356 61278 32644 34703 39336 

[[6]] 
[1] 39336 61278 

[[7]] 
[1] 19054 52356 61278 32644 34703 61278 18221 

[[8]] 
[1] 32644 18221 14095 32644 15780 39336 

[[9]] 
[1] 33148 18221 33148 14095 32644 12237 32644 61278 

[[10]] 
[1] 12237 14095 52356 12237 39336 61278 

[[11]] 
[1] 15780 34703 15780 34703 15780 19054 

[[12]] 
[1] 12237 52356 61278 12237 39336 19054 61278 

[[13]] 
[1] 52356 54104 32644 19054 61278 19054 

[[14]] 
[1] 54104 39336 61278 19054 61278 32644 39336 

[[15]] 
[1] 5816 54104 32644 52356 19054 52356 

[[16]] 
[1] 5816 19054 39336 

[[17]] 
[1] 19054 54104 5816 19054 52356 19054 

Jede Unterliste beschreibt einen Pfad, beginnend mit dem ersten Element, und endet mit '4'. Zum Beispiel beginnt der vierte Pfad am Knoten 19054, geht zu 52356 und endet dann zu 4.

Was ich tun möchte, ist das Erfassen des Anteils der Zeiten, die ein Knoten in einem Pfad von einem gegebenen Startknoten aus beteiligt ist .

Zum Beispiel, wenn wir an dem Knoten suchen, die einen Weg begonnen, wir haben:

rapply(p, function(x) { head(x, 1)}) 

5816 12237 15780 19054 32644 33148 39336 52356 54104 
    2  2  2  4  2  1  1  2  1 

so, für diesen Weg, der durch den Knoten 54104 gestartet wurde, ich vergeben will, dass alle beteiligten Knoten eine Punktzahl von "1". Mit anderen Worten, ich möchte eine Tabelle abzuleiten wie: enter image description here

, wo ich die Schreibweise verwendet haben (n (i, j, X)), um die Anzahl der Wege zu bedeuten, die bei i, endete in X gestartet und beteiligt j. Ich habe den folgenden Versuch:

m <-matrix(0, nrow = 14, ncol= 14) 

for(path in 1:length(p)){ 
    path <- 1 
     verticesofPath <- as.integer(p[[path]]) 

     for (i in 2:length(verticesofPath)){ 
     m[verticesofPath[1], verticesofPath[i]] <- m[verticesofPath[1], verticesofPath[i]] + 1 
     } 

} 

der Fehler ist hier, dass die Knoten-IDs ganze Zahlen sind, und so kann ich sie nicht in einer 15x15-Matrix setzt die ids als Referenz verwendet. Wie ordne ich die IDs den Integern 1-15 zu, damit ich verfolgen kann, welche Knoten in jedem Pfad stattgefunden haben und in der Lage bin, zurück zu mappen und rownames/colnames an die Matrix zu geben, die die anfänglichen Node-IDs sind?

Antwort

1

Ich denke, ein logischer Ansatz wäre, den Index des ID-Wertes in einen kanonischen ID-Vektor als Zeilen- und Spaltenindex der Ergebnismatrix zu verwenden.

Die match() Funktion ist hier hilfreich. Sie können Knoten-IDs in den kanonischen ID-Vektor einbinden, um deren Index in diesem Vektor abzurufen, der dann als Zeilen- oder Spaltenindex in der Ergebnismatrix verwendet werden kann. Um rückwärts zu mappen, können Sie einfach den kanonischen ID-Vektor mit dem Zeilen- oder Spaltenindex als Vektor-Index indexieren, um die ursprüngliche Knoten-ID abzurufen.

Hier ist, wie dies getan werden kann:

m <- matrix(0L,length(ids),length(ids),dimnames=list(from=ids,involved=ids)); 
for (pi in seq_along(p)) { ## iterate over all paths; pi is the path index into p 
    involved <- p[[pi]][-1L]; ## get the subvector of node ids involved in (but not starting) the path 
    involvedUnique <- unique(involved); ## get the unique involved ids in occurrence order 
    involvedCount <- tabulate(match(involved,involvedUnique)); ## get their counts 
    ri <- match(p[[pi]][1L],ids); ## compute the implicit row index of the starting node 
    cis <- match(involvedUnique,ids); ## compute the implicit column indexes of the involved nodes 
    m[ri,cis] <- m[ri,cis]+involvedCount; ## accrue the counts onto the result matrix 
}; ## end for 
m; 
##  involved 
## from 39336 19054 32644 52356 14095 18221 12237 61278 34703 15780 33148 54104 5816 92819 4 
## 39336  0  0  0  0  0  0  0  1  0  0  0  0 0  0 0 
## 19054  1  3  2  4  0  1  0  3  2  1  0  1 1  0 0 
## 32644  1  2  2  0  1  1  1  0  0  2  0  0 0  0 0 
## 52356  0  5  1  0  0  0  0  3  0  1  0  1 0  0 0 
## 14095  0  0  0  0  0  0  0  0  0  0  0  0 0  0 0 
## 18221  0  0  0  0  0  0  0  0  0  0  0  0 0  0 0 
## 12237  2  1  0  2  1  0  2  3  0  0  0  0 0  0 0 
## 61278  0  0  0  0  0  0  0  0  0  0  0  0 0  0 0 
## 34703  0  0  0  0  0  0  0  0  0  0  0  0 0  0 0 
## 15780  0  3  1  0  2  0  1  0  2  2  0  0 0  0 0 
## 33148  0  0  2  0  1  1  1  1  0  0  1  0 0  0 0 
## 54104  2  1  1  0  0  0  0  2  0  0  0  0 0  0 0 
## 5816  1  2  1  2  0  0  0  0  0  0  0  1 0  0 0 
## 92819  0  0  0  0  0  0  0  0  0  0  0  0 0  0 0 
## 4   0  0  0  0  0  0  0  0  0  0  0  0 0  0 0 

Daten

ids <- c(39336L,19054L,32644L,52356L,14095L,18221L,12237L,61278L,34703L,15780L,33148L,54104L, 
5816L,92819L,4L); 
p <- list(c(52356L,61278L,19054L,15780L,19054L,61278L,19054L),c(15780L,19054L,32644L,14095L, 
12237L,19054L,14095L),c(32644L,15780L,19054L,32644L,12237L,19054L),c(19054L,52356L),c(19054L, 
15780L,19054L,52356L,61278L,32644L,34703L,39336L),c(39336L,61278L),c(19054L,52356L,61278L, 
32644L,34703L,61278L,18221L),c(32644L,18221L,14095L,32644L,15780L,39336L),c(33148L,18221L, 
33148L,14095L,32644L,12237L,32644L,61278L),c(12237L,14095L,52356L,12237L,39336L,61278L),c(
15780L,34703L,15780L,34703L,15780L,19054L),c(12237L,52356L,61278L,12237L,39336L,19054L,61278L 
),c(52356L,54104L,32644L,19054L,61278L,19054L),c(54104L,39336L,61278L,19054L,61278L,32644L, 
39336L),c(5816L,54104L,32644L,52356L,19054L,52356L),c(5816L,19054L,39336L),c(19054L,54104L, 
5816L,19054L,52356L,19054L)); 

Ich sollte klarstellen, dass ich Bemaßungsnamen und Etiketten auf die Ergebnismatrix rein ästhetischen Zwecken zugesetzt. Es ist natürlich möglich, Dimensionsnamen als Indizes bei Indexierungsoperationen zu verwenden, und somit wäre es möglich, die ID-Werte selbst als Indizes zu verwenden, indem sie beim Indexieren zu Zeichenwerten gezwungen werden, aber ich empfehle das Gegenteil. Ich denke nicht, dass es ein sehr sauberer Ansatz ist, um überall Zwang anzuwenden, und es könnte zu komplizierten Komplikationen führen. Wenn Sie sich beispielsweise in einer Situation mit vorgekreisten ID-Werten befinden, die geringfügig unterschiedliche Zeichenfolgendarstellungen aufweisen, z. B. externe Leerzeichen, digit group separators oder führende Nullen, kann dies zu Indexfehlern führen.