将igraph.vs转换为数据框

Tay*_*rer 5 r igraph dataframe

所以我使用all_shortest_paths来获取输出,如下所示:

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  
Run Code Online (Sandbox Code Playgroud)

我想将其转换为数据框,以便可以对其进行操作。作为参考,我希望数据框看起来像这样:

                  Prot1      Prot2   Prot3   Prot4
         Pathway1 Sortilin   GGA1    PLK1    PIMT
         Pathway2 Sortilin   TrkA    PLK1    PIMT 
         Pathway3 Sortilin   APP     JAB1    PIMT               
Run Code Online (Sandbox Code Playgroud)

*我知道如何更改
我尝试过的轴名称

PathsDF<-as.data.frame(PathsE)
Run Code Online (Sandbox Code Playgroud)

但是我得到这个错误:

as.data.frame.default(x [[i]],可选= TRUE)中的错误:无法将类“ igraph.vs”强制转换为data.frame

我也试过这个:

PathDF <- as.data.frame(get.edgelist(PathsE))
Run Code Online (Sandbox Code Playgroud)

但是我得到这个错误

get.edgelist(PathsE)中的错误:不是图形对象

当我使用检查数据结构时

class(PathsEF)
Run Code Online (Sandbox Code Playgroud)

它说这是一个清单。但是当我使用

str(PathsE)
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

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

在我看来,这就像一个矩阵。

从这些信息中,您中的任何一个都对如何将其转换为数据框有任何想法。如果我遗漏任何明显的东西,我感到抱歉-我是R的新手!

paq*_*qmo 5

首先,有两个澄清点。创建的对象all_shortest_paths是一个包含两个元素的列表:1)res和2)nrgeo。该res对象也是一个列表-而是一个igraph.vs对象列表。的igraph.vs对象是igraph已知的作为顶点序列特定对象。Base R函数将不知道如何处理它。因此,我们使用该as_id函数将igraph.vs对象转换为id的向量。

由于PathsE$resigraph.vs对象列表,因此您需要遍历该列表并将其折叠到数据框中。有几种方法可以做到这一点。这是一个:

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
Run Code Online (Sandbox Code Playgroud)

这将产生一个矩阵,但请注意,它是您想要的转置:

> 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
Run Code Online (Sandbox Code Playgroud)

因此,将其转置并转换为数据帧:

> 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
Run Code Online (Sandbox Code Playgroud)

我们可以在一行代码中完成:

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)))
Run Code Online (Sandbox Code Playgroud)