Vinay - 7 months ago 44

R Question

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. 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?

`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:

`ALDOA`

APLP1

GRB2

RPA2

FLNC

BCL3

APP

RALGDS

PRRC2A

NARS

LSM1

GGA3

FNTA

Answer

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 :**

**Graph g2 :**

**Graph g3 :**

Source (Stackoverflow)