Creating Subgraph using igraph in R
我需要使用igraph从图(g)获取种子节点(节点的输入列表; file.txt)及其第一个交互器(邻居)的子图。 不幸的是,我最终仅在子图中得到一个节点,而不是所有其他将它们互连的节点和边(顶点)。
1 2 3 4 5 6 7 8 | g<-read.graph("DATABASE.ncol",format="ncol",directed=FALSE) #load the data g2<-simplify(g, remove.multiple=TRUE, remove.loops=TRUE) # Remove the self-loops in the data DAT1 <- readLines("file.txt") #It provides a character vector right away list_nodes_1 = neighbors(g2, DAT1) #list of nodes to be fetched in subnetwork list_nodes_1 # 16 g3 <- induced.subgraph(graph=g2,vids=DAT1) #subnetwork construction g3 # GRAPH UN-- 1 0 --; indicating only one node plot (g3) |
对于获取整个子网(包括节点和顶点)有什么建议吗? 还是有其他功能可用于创建子图?
DATABASE.ncol:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | MAP2K4 FLNC MYPN ACTN2 ACVR1 FNTA GATA2 PML RPA2 STAT3 ARF1 GGA3 ARF3 ARFIP2 ARF3 ARFIP1 XRN1 ALDOA APP APPBP2 APLP1 DAB1 CITED2 TFAP2A EP300 TFAP2A APOB MTTP ARRB2 RALGDS CSF1R GRB2 PRRC2A GRB2 LSM1 NARS SLC4A1 SLC4A1AP BCL3 BARD1 |
这是一个简单的文本文件,每行一条边。 一条边由两个用制表符分隔的符号顶点名称定义:
file.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 | ALDOA APLP1 GRB2 RPA2 FLNC BCL3 APP RALGDS PRRC2A NARS LSM1 GGA3 FNTA |
我不确定是否已完全理解您的问题,所以我创建了一个(希望)不言自明的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # for example reproducibility set.seed(123) # create a fake undirected graph D <- read.table( sep=',', header=T, text= 'from,to A,B A,C D,E F,G H,I') g1 <- graph.data.frame(D,directed=F) plot(g1) # we want a sub-network containing the floowing nodes: subv <- c('A','B','H') # first method: # create a sub-network composed by ONLY the nodes in subv and the edges # between them g2 <- induced.subgraph(graph=g1,vids=subv) plot(g2) # second method: # create a sub-network composed by the nodes in subv and, if some of them is # connected to other nodes (even if not in subv), take also them # (and of course include all the edges among this bunch of nodes). sg1 <- decompose.graph(g1,mode="weak") neighverts <- unique(unlist(sapply(sg1,FUN=function(s){if(any(V(s)$name %in% subv)) V(s)$name else NULL}))) g3 <- induced.subgraph(graph=g1,vids=neighverts) plot(g3) |
图g1:
图g2:
图表g3:
有一个内置的igraph函数。 尝试make_ego_graph():
1 2 3 4 5 6 | library(igraph) graph <- make_ring(7) V(graph)$name <- c("A","B","C","D","E","F","G") # Get the list of induced subgraphs subgraph <- make_ego_graph(graph, order=1, c("A","D","F")) |