Можно ли с помощью igraph в R удалить подграфы, которые не удовлетворяют определенным условиям? - PullRequest
1 голос
/ 30 октября 2019

Я хочу создать подграф, который включает все кластеры / группы, состоящие как минимум из одного красного и одного зеленого узла. Однако кластеры должны по-прежнему включать серые узлы на случай, если в конкретном кластере также есть серые узлы.

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 голосов
/ 30 октября 2019

Когда вы говорите: «Я хочу создать подграф, который включает все кластеры / группы, состоящие как минимум из одного красного и одного зеленого узла.», Я предполагаю, что вы имеете в виду подключенные компоненты. Итак, вкратце, вы хотите, чтобы подграф индуцировался всеми серыми узлами вместе с теми узлами в связанных компонентах, которые содержат как минимум один красный и один зеленый узел.

Это не так сложно сделать. Сначала вычислите подключенные компоненты. Составьте список узлов для хранения и сгенерируйте подграф.

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

...