R中的igraph是否可以删除不满足某些条件的子图?

时间:2019-10-30 20:28:57

标签: r igraph subgraph

我想创建一个包括所有由至少一个红色和一个绿色节点组成的群集/组的子图。但是,如果在特定群集中也存在灰色节点,则群集仍应包括灰色节点。

library (igraph)

#### Random graph #####
set.seed(123) #reproduction
g <- erdos.renyi.game(75,1/75, directed =  F, loops = F)

#### simple random sample from graph object #####
set.seed(123) #reproduction
smpl1 <- sample(1:vcount(g),20)
smpl2 <- sample(1:vcount(g),20)

##### add colours #####
V(g)$color = "green"
V(g)[smpl1]$color = "red"
V(g)[smpl2]$color = "grey"

set.seed(123) #reproduction
plot(g,
     vertex.label.color = "Black",
     vertex.size = 10,
     layout = layout.fruchterman.reingold(g))

使用上面的代码,预期输出是一个图,其中包括具有至少一个绿色和一个红色节点的其余(四个)群集。

1 个答案:

答案 0 :(得分:0)

当您说“我想创建一个包含至少由一个红色和一个绿色节点组成的所有群集/组的子图。”时,我假设您的意思是连接的组件。因此,要进行重述,您希望所有灰色节点以及连接的组件中的那些节点(至少包含一个红色和一个绿色节点)诱发的子图。

做到这一点并不难。首先计算连接的组件。列出要保留并生成子图的节点的列表。

CG = components(g)
KeepNodes = which(V(g)$color == "grey")
for(i in 1:max(CG$membership)) {
    CompNodes = which(CG$membership == i)
    if(any(V(g)$color[CompNodes] == "green") + 
        any(V(g)$color[CompNodes] == "red") == 2) {
        KeepNodes = union(KeepNodes, CompNodes) }
}
SubGraph = induced_subgraph(g, KeepNodes)
plot(SubGraph)

sub-graph