我想创建一个包括所有由至少一个红色和一个绿色节点组成的群集/组的子图。但是,如果在特定群集中也存在灰色节点,则群集仍应包括灰色节点。
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))
使用上面的代码,预期输出是一个图,其中包括具有至少一个绿色和一个红色节点的其余(四个)群集。
答案 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)