将来自2个不同图形的边序列合并为一个图形R

时间:2018-07-15 17:07:37

标签: r igraph

我创建了2张图。我发现这两个图之间存在公共节点。我想将两个图中的公共节点合并为一个图。我从图1中得到了节点的边缘序列(公共),同样地,我从图2中提取了相同节点的边缘序列。如何将这两个图的边缘序列合并为一个图?

    idx <- match(c("DISC1","GSK3B", "YWHAE", "NRG1", "BDNF", "FYN", "DCC", "FOXP2", "GRM5", "MIR137", "NEUROG1"), V(prenatal_direct)$name)# common nodes in graph 1

    g <-E(prenatal_direct) [ from(idx) ] # edge sequence of common nodes in graph 1



+ 71/139 edges from e0b7f5c (vertex names):
 [1] AKT1  --DISC1    BDNF  --ARNT2    BDNF  --HAP1     BDNF  --HTT     
 [5] BDNF  --NPAS4    DCC   --DSCAM    DCC   --FAK      DCC   --FYN     
 [9] DCC   --MADD2    DCC   --NTN1     DCC   --STX1A    DCC   --TUBB3   
[13] DCC   --VAMP7    DISC1 --DTNBP1   DISC1 --GSK3B    DISC1 --YWHAE   
[17] DISC1 --ACTB     DISC1 --ADCYAP1  DISC1 --CHL1     DISC1 --DIXDC1  
[21] DISC1 --ERBB4    DISC1 --EXOC1    DISC1 --FEZ1     DISC1 --GRB2    
[25] DISC1 --ITPR1    DISC1 --ITPR3    DISC1 --KIF5A    DISC1 --NDE1    
[29] DISC1 --NDEL1    DISC1 --NKX2-2   DISC1 --PAFAH1B1 DISC1 --PDE4B   
[33] DISC1 --SRR      DISC1 --TNIK     DISC1 --ZNF365   DISC1 --ZNF385A 
[37] DLG2  --FYN      FOXP2 --MEF2C    FOXP2 --MIR132   FOXP2 --MIR9    
+ ... omitted several edges

    idx_indirect <-match(c("DISC1","GSK3B", "YWHAE", "NRG1", "BDNF", "FYN", "DCC", "FOXP2", "GRM5", "MIR137", "NEUROG1"), V(prenatal_indirect)$name)# common nodes in graph 2

    g_indirect <- E(prenatal_indirect) [ from(idx_indirect) ] # edge sequence of common nodes in graph 2

+ 78/216 edges from ebb1a90 (vertex names):
 [1] BDNF --GSK3B    BDNF --MIR137   BDNF --NOS1     BDNF --NRG1     BDNF --CREB1   
 [6] BDNF --EGF      BDNF --EGR3     BDNF --EPS8     BDNF --ERK1     BDNF --ERK2    
[11] BDNF --MECP2    BDNF --MIR9     BDNF --NAB2     BDNF --NGFR     BDNF --NTRK2   
[16] BDNF --TH       BDNF --WASF1    DCC  --BCL11A   DCC  --FYN      DCC  --NTN1    
[21] DCC  --RASA1    DCC  --TRIO     DISC1--GSK3B    DISC1--NRXN1    DISC1--PCM1    
[26] DISC1--APP      DISC1--ATF4     DISC1--BBS4     DISC1--CCDC141  DISC1--DAAM1   
[31] DISC1--DAB1     DISC1--DIXDC1   DISC1--ERK1     DISC1--FOXD3    DISC1--GABRB2  
[36] DISC1--GABRB3   DISC1--KALRN    DISC1--KIF5C    DISC1--LRRC7    DISC1--MEK     
[41] DISC1--MYH2     DISC1--NDEL1    DISC1--OLIG2    DISC1--PAFAH1B1 DISC1--PDE4B   
[46] DISC1--PDE4D    DISC1--RASSF7   DISC1--RHOA     DISC1--SMO      DISC1--SOX10   
+ ... omitted several edges

谢谢

Priya

2 个答案:

答案 0 :(得分:1)

您可以找到共享节点的列表,然后从包含这些节点之一的任一图中获取所有边。我用一些人工数据进行说明。

初始数据

EL1 = structure(c("ZUNO", "IPHL", "ESZF", "IPHL", "IPHL", "ZUNO", "RMFZ", 
"ESZF", "RMFZ", "DMLR", "EVUA", "IAFQ", "BHRL", "BHRL", "DMLR", 
"DMLR", "EVUA", "IAFQ", "IAFQ", "IMBY", "IMBY", "IMBY", "DWAS", 
"DWAS"), .Dim = c(12L, 2L))

EL2 = structure(c("ESZF", "ISAM", "DMLR", "ISAM", "DMLR", "ISAM", "ISAM", 
"GMLH", "HFDZ", "ZPDJ", "DMLR", "FWYG", "FWYG", "DTRV", "IMBY", 
"GMLH", "ZPDJ", "ZPDJ", "XLVN", "XLVN"), .Dim = c(10L, 2L))

G1 = graph_from_edgelist(EL1, directed=FALSE)
G2 = graph_from_edgelist(EL2, directed=FALSE)

par(mfrow=c(1,2))
plot(G1)
plot(G2)

Two graphs sharing nodes

我们有两个共享几个节点的图以及这些图的边列表。共享节点很容易找到。

intersect(EL1, EL2)
[1] "ESZF" "DMLR" "IMBY"

要查找G1中的哪些边包含共享节点,我们可以使用

EL1[rowSums(matrix(EL1 %in% SharedNodes, ncol=2)) > 0,]

我们可以对G2进行同样的操作,并使用rbind合并边缘列表。可能会有一些重复的边缘,我们将其删除。

SharedNodes = intersect(EL1, EL2)
NewEL = rbind(EL1[rowSums(matrix(EL1 %in% SharedNodes, ncol=2)) > 0,],
              EL2[rowSums(matrix(EL2 %in% SharedNodes, ncol=2)) > 0,])
NewEL = unique(NewEL)
NewG  = graph_from_edgelist(NewEL, directed=FALSE)
plot(NewG)

New G

此图包含所有共享节点,并且其中任一图包含任何一个共享节点的任何边。

答案 1 :(得分:0)

使用所选节点的边缘序列创建两个子图,然后合并两个子图。

示例:图1和图2有10个节点,我有兴趣合并图1和图2中的A,B,C,D和E节点

AccessibilityInfo

Priya