2016-11-17 38 views
1

我想一个graphNEL图形转换为network图的graphNEL图。转换为网络图

下面是使用topGOvignette我的例子:

library(topGO) 
    library(ALL) 
    data(ALL) 
    data(geneList) 
    affyLib <- paste(annotation(ALL),"db",sep= ".") 
    library(package=affyLib,character.only=TRUE) 
    topgo.obj <- new("topGOdata",description="Simple session",ontology="BP",allGenes=geneList,geneSel=topDiffGenes,nodeSize=10,annot=annFUN.db,affyLib=affyLib) 

topgo.graph <- attr(topgo.obj,"graph") 

,并试图topgo.graph转换为一个网络,通过intergraph

library(network) 
    library(sna) 
    library(scales) 
    library(igraph) 
    library(intergraph) 

    topgo.igraph <- graph_from_graphnel(topgo.graph,name=TRUE,weight=TRUE,unlist.attrs=TRUE) 

最后

topgo.network <- asNetwork(topgo.igraph,amap=attrmap()) 

抛出这个错误:

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

当我尝试这与intergraph的例子:

asNetwork(exIgraph) 

它工作正常 而据我可以告诉exIgraph和topgo.igraph类似于:

> exIgraph 
IGRAPH D--- 15 11 -- 
+ attr: label (v/c), label (e/c) 
+ edges: 
[1] 2-> 1 3-> 1 4-> 1 5-> 1 6-> 7 8-> 9 10->11 11->12 12->13 13->14 14->12 

> topgo.igraph 
IGRAPH DNW- 1017 2275 -- 
+ attr: name (v/c), genes (v/x), weight (e/n) 
+ edges (vertex names): 
[1] GO:0000003->GO:0008150 GO:0000070->GO:0000278 GO:0000070->GO:0007067 GO:0000070->GO:1903047 GO:0000070->GO:0000819 
[6] GO:0000075->GO:0022402 GO:0000077->GO:0031570 GO:0000077->GO:0006974 GO:0000079->GO:1904029 GO:0000079->GO:0071900 
[11] GO:0000082->GO:0044772 GO:0000082->GO:0044843 GO:0000086->GO:0000278 GO:0000086->GO:0044772 GO:0000086->GO:0044839 
[16] GO:0000122->GO:0006357 GO:0000122->GO:0045892 GO:0000122->GO:0006366 GO:0000165->GO:0035556 GO:0000165->GO:0023014 
[21] GO:0000187->GO:0032147 GO:0000187->GO:0043406 GO:0000209->GO:0016567 GO:0000226->GO:1902589 GO:0000226->GO:0007010 
[26] GO:0000226->GO:0007017 GO:0000278->GO:0007049 GO:0000280->GO:0048285 GO:0000302->GO:0006979 GO:0000302->GO:1901700 
[31] GO:0000723->GO:0006259 GO:0000723->GO:0032200 GO:0000723->GO:0060249 GO:0000819->GO:1902589 GO:0000819->GO:0098813 
[36] GO:0000819->GO:0051276 GO:0000902->GO:0032989 GO:0000910->GO:0022402 GO:0000910->GO:0051301 GO:0001501->GO:0048731 
+ ... omitted several edges 

任何理念?

回答

1

这是因为“基因”属性的发生。如果您使用V(topgo.igraph)$gene查看它,则会看到它返回环境列表而非矢量。当深入intergraph代码时,它会尝试将顶点属性强制转换为数据框架,这是它无法做到的。 (这发生在dumpAttr()功能 - 见getAnywhere(dumpAttr.igraph)。)

为了解决这个问题,你可以简单的删除该属性:

topgo.igraph <- delete_vertex_attr(topgo.igraph,"genes") 
topgo.network <- asNetwork(topgo.igraph,amap=attrmap()) 

的论点unlist.attrs=T我认为是为了防止上述确切的问题,但它在这种情况下不起作用。这可能是由于网络中的基因使用的命名约定。

如果你看一下从原来的graphNEL对象的属性,你会发现,它是由environment类的对象:

> head(graph::nodeData(topgo.graph, attr = "genes")) 
$`GO:0000003` 
<environment: 0x15c005ae0> 

$`GO:0000070` 
<environment: 0x15c136bf0> 

$`GO:0000075` 
<environment: 0x15c118a70> 

$`GO:0000077` 
<environment: 0x15c13ae70> 

$`GO:0000079` 
<environment: 0x163145670> 

$`GO:0000082` 
<environment: 0x16313d148>) 

你也可以改变原来的topGO对象的属性数据来解决问题还有:

nodeData(topgo.graph, attr = "genes") <- [email protected]@nodes 
topgo.igraph <- graph_from_graphnel(topgo.graph,name=TRUE,weight=TRUE,unlist.attrs=TRUE) 
topgo.network <- asNetwork(topgo.igraph,amap=attrmap()) 

这保留了一个顶点属性的基因,如果你想要的是:

> head(network::get.vertex.attribute(topgo.network, "genes")) 
[1] "GO:0000003" "GO:0000070" "GO:0000075" "GO:0000077" "GO:0000079" "GO:0000082"