将 graphNEL 图转换为网络图
Convert a graphNEL graph to a network graph
我正在尝试将 graphNEL
图表转换为 network
图表。
这是我使用 topGO
的 vignette
:
的示例
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")
并尝试通过 intergraph
将 topgo.graph
转换为网络
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
有什么想法吗?
发生这种情况是因为 "gene" 属性。如果您使用 V(topgo.igraph)$gene
查看它,您将看到它 return 环境列表而不是向量。当深入 intergraph
代码时,它会尝试将顶点属性强制转换为数据框,但这是它做不到的。 (这发生在 dumpAttr()
函数中——参见 getAnywhere(dumpAttr.igraph)
。)
要解决这个问题,您可以简单地删除属性:
topgo.igraph <- delete_vertex_attr(topgo.igraph,"genes")
topgo.network <- asNetwork(topgo.igraph,amap=attrmap())
参数unlist.attrs=T
我认为是为了防止上面的确切问题而设计的,但在这种情况下不起作用。这 可能 是由于网络中基因使用的命名约定。
如果您查看原始 graphNEL 对象的属性,您会注意到它由 class 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") <- topgo.obj@graph@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"
我正在尝试将 graphNEL
图表转换为 network
图表。
这是我使用 topGO
的 vignette
:
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")
并尝试通过 intergraph
topgo.graph
转换为网络
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
有什么想法吗?
发生这种情况是因为 "gene" 属性。如果您使用 V(topgo.igraph)$gene
查看它,您将看到它 return 环境列表而不是向量。当深入 intergraph
代码时,它会尝试将顶点属性强制转换为数据框,但这是它做不到的。 (这发生在 dumpAttr()
函数中——参见 getAnywhere(dumpAttr.igraph)
。)
要解决这个问题,您可以简单地删除属性:
topgo.igraph <- delete_vertex_attr(topgo.igraph,"genes")
topgo.network <- asNetwork(topgo.igraph,amap=attrmap())
参数unlist.attrs=T
我认为是为了防止上面的确切问题而设计的,但在这种情况下不起作用。这 可能 是由于网络中基因使用的命名约定。
如果您查看原始 graphNEL 对象的属性,您会注意到它由 class 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") <- topgo.obj@graph@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"