简体   繁体   English

在R中使用igraph创建子图

[英]Creating Subgraph using igraph in R

I need to obtain a subgraph of the seed nodes (the input list of nodes; file.txt) and their first interactors (neighbours) from a graph (g) using igraph. 我需要使用igraph从图(g)获取种子节点(节点的输入列表; file.txt)及其第一个交互器(邻居)的子图。 Unfortunately, I am ending up with only a single node in the subgraph, and not all the rest of the nodes and edges (vertices) which interlink them. 不幸的是,我最终仅在子图中得到一个节点,而不是所有其他将它们互连的节点和边(顶点)。

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)

Any suggestions for obtaining the whole subnetwork (including nodes and vertices)? 对于获取整个子网(包括节点和顶点)有什么建议吗? or is there any other function available for creating sub-graphs? 还是有其他功能可用于创建子图?

DATABASE.ncol: DATABASE.n​​col:

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

It is a simple text file with one edge per line. 这是一个简单的文本文件,每行一条边。 An edge is defined by two symbolic vertex names delimited by tab: 一条边由两个用制表符分隔的符号顶点名称定义:

file.txt file.txt

ALDOA
APLP1
GRB2
RPA2
FLNC
BCL3
APP
RALGDS
PRRC2A
NARS
LSM1
GGA3
FNTA

I'm not sure to have completely understood your problem, so I have created a (hopefully) self-explanatory example: 我不确定是否已完全理解您的问题,所以我创建了一个(希望)不言自明的示例:

# 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)

Graph g1 : 图g1:

11

Graph g2 : 图g2:

22

Graph g3 : 图表g3:

33

There is a built-in igraph function for that. 有一个内置的igraph函数。 Try make_ego_graph(): 尝试make_ego_graph():

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"))

图及其三个子图

How do we use a selected set of vertices based on an attribute that could be NA for some of the vertices? 我们如何基于某些顶点可能为NA的属性使用一组选定的顶点? imagine in your example V(graph)$att1 <- c(1,2,NA,1,2,3,NA) and wanted to select the vertices that had att1 == 1. I tried selecting the name of those vertices by V(graph)[att1 == 1, na_ok = TRUE]$name but it doesn't work. 想象在您的示例中V(graph)$ att1 <-c(1,2,NA,1,2,3,NA)并想要选择att1 == 1的顶点。我尝试通过选择这些顶点的名称V(graph)[att1 == 1,na_ok = TRUE] $ name,但它不起作用。 gives me error "Error in if (is.numeric(v) && any(v < 0)) { : missing value where TRUE/FALSE needed" 给我一个错误“ if(is.numeric(v)&& any(v <0))中的错误{:缺少值,需要TRUE / FALSE”

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM