2017-07-12 4 views
2

Drehen Also ich bin mit all_shortest_paths um eine Ausgabe zu erhalten, die wie folgt aussieht:eine igraph.vs in einen Datenrahmen

PathsE 

$res[[1]] 
+ 4/990 vertices, named: 
[1] Sortilin GGA1  Ubiquitin PIMT  

$res[[2]] 
+ 4/990 vertices, named: 
[1] Sortilin TrkA  PLK1  PIMT  

$res[[3]] 
+ 4/990 vertices, named: 
[1] Sortilin APP  JAB1  PIMT 

Ich mag machen dies zu einem Datenrahmen, so dass ich es manipulieren kann. Als Referenz möchte ich die Datenrahmen wie folgt aussehen:

    Prot1  Prot2 Prot3 Prot4 
     Pathway1 Sortilin GGA1 PLK1 PIMT 
     Pathway2 Sortilin TrkA PLK1 PIMT 
     Pathway3 Sortilin APP  JAB1 PIMT    

* Ich weiß, wie die Achsen Namen ändern
ich versucht habe

PathsDF<-as.data.frame(PathsE) 

aber ich habe diesen Fehler:

Error in as.data.frame.default(x[[i]], optional = TRUE) : cannot coerce class ""igraph.vs"" to a data.frame

ich habe auch versucht diese:

PathDF <- as.data.frame(get.edgelist(PathsE)) 

aber ich habe diesen Fehler

Error in get.edgelist(PathsE) : Not a graph object

Wenn ich die Daten strture mit

class(PathsEF) 

es untersuchen sagt, es ist eine Liste. Aber wenn ich

str(PathsE) 

es scheint wie folgt aus:

..$ :Class 'igraph.vs' atomic [1:4] 338 204 40 913 
.. .. ..- attr(*, "env")=<weakref> 
.. .. ..- attr(*, "graph")= chr "717e99fb-b7db-4e35-8fd3-1d8d741e6612" 
etc 

, die wie eine Matrix mir aussieht.

Haben Sie von diesen Informationen irgendwelche Ideen, wie Sie dies in einen Datenrahmen umwandeln können. Es tut mir leid, wenn mir etwas offensichtlich fehlt - ich bin ziemlich neu in R!

+0

Was wollen Sie Ihren Datenrahmen aussehen? – paqmo

+0

Bitte sehen Sie meine Änderungen! –

Antwort

1

Zuerst ein paar klärende Punkte. Das von all_shortest_paths erstellte Objekt ist eine Liste mit zwei Elementen: 1) res und 2) nrgeo. Das Objekt res ist auch eine Liste - aber eine Liste von igraph.vs Objekten. Das Objekt igraph.vs ist ein igraph spezifisches Objekt, das als Vertexsequenz bezeichnet wird. Base R-Funktionen werden nicht wissen, was damit zu tun ist. Also verwenden wir die as_id Funktion, um ein igraph.vs Objekt in einen Vektor von IDs zu konvertieren.

Da PathsE$res eine Liste von igraph.vs Objekten ist, müssen Sie über die Liste iterieren und sie in einen Datenrahmen komprimieren. Es gibt mehrere Möglichkeiten, dies zu tun.Hier ist eine:

set.seed(6857) 
g <- sample_smallworld(1, 100, 5, 0.05) #Building a random graph 
sp <- all_shortest_paths(g, 5, 70) 
mat <- sapply(sp$res, as_ids) 
#sapply iterates the function as_ids over all elements in the list sp$res and collapses it into a matrix 

Diese eine Matrix erzeugt, aber feststellen, dass es die Transponierte von dem, was Sie wollen:

> mat 
    [,1] [,2] [,3] [,4] 
[1,] 5 5 5 5 
[2,] 100 4 100 1 
[3,] 95 65 65 75 
[4,] 70 70 70 70 

So transponieren und konvertieren zu einem Datenrahmen:

> df <- as.data.frame(t(mat)) 
    V1 V2 V3 V4 
1 5 100 95 70 
2 5 4 65 70 
3 5 100 65 70 
4 5 1 75 70 

Was können wir in einer einzigen Codezeile tun:

set.seed(6857) 
g <- sample_smallworld(1, 100, 5, 0.05) 
sp <- all_shortest_paths(g, 5, 70) 
df <- as.dataframe(t(sapply(sp$res, as_ids))) 
+0

Vielen Dank! Das hat geklappt (und viel geklärt!) –

0

Eigentlich, das ist ganz einfach:

data.frame <- get.data.frame(g, what= c("vertices", "edges", "both")) 

bewusst sein, unter den „was“ Optionen zu wählen.

Sie können sie auch in einem CSV-Format mit diesem Skript speichern:

write.csv(data.frame, "data.frame.csv") 
Verwandte Themen