Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Turning an igraph.vs into a data frame

So I am using all_shortest_paths to get an output, which looks like this:

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  

I would like to turn this into a dataframe so that I can manipulate it. For reference, I would like the dataframe to look like this:

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

*I know how to change the axes names
I have tried

PathsDF<-as.data.frame(PathsE)

but I get this error:

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

I also tried this:

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

but I get this error

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

When I examine the data strture using

class(PathsEF)

it says it is a list. But when I use

str(PathsE)

it appears like this:

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

which looks like a matrix to me.

From this information, do any of you have any ideas about how to convert this into a dataframe. I am sorry if I am missing anything obvious- I am pretty new to R!

like image 612
Taylor Maurer Avatar asked Jul 12 '17 22:07

Taylor Maurer


2 Answers

First, a couple of clarifying points. The object created by all_shortest_paths is a list with two elements: 1) res and 2) nrgeo. The res object is also a list--but a list of igraph.vs objects. The igraph.vs object is an igraph specific object known as a vertex sequence. Base R functions won't know what to do with it. So we use the as_id function to convert an igraph.vs object to a vector of ids.

Since PathsE$res is a list of igraph.vs objects, you need to iterate over the list and collapse it into a data frame. There are several ways to do this. Here is one:

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

This produces a matrix, but notice that it is the transpose of what you want:

> 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, transpose it and convert to a data frame:

> 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

Which we can do in a single line of code:

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)))
like image 149
paqmo Avatar answered Nov 13 '22 15:11

paqmo


Actually, that's simple:

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

Be aware to choosing among the "what" options.

You also can save it in a .csv format using this script:

write.csv(data.frame, "data.frame.csv")
like image 30
Artur Neves de Assis Avatar answered Nov 13 '22 15:11

Artur Neves de Assis