Удаление ребер с помощью меток вершин в Igraph

Я новичок в R. У меня есть объект графа igraph, и я случайным образом пометил вершины как ИСТИНА или ЛОЖЬ. Есть ли способ удалить ребра, которые находятся между двумя вершинами с меткой ИСТИНА или двумя вершинами с меткой ЛОЖЬ?

Вот мой код:

g <- read_graph("grph.graphml", format = c("graphml"))
num_of_edges <- gorder(g)
random_list <- sample(c(TRUE,FALSE), num_of_vertices, TRUE) 
V(g)$label <- random_list

person Winston    schedule 02.03.2018    source источник
comment
Обращаясь за помощью, вы должны указать простой воспроизводимый пример с образцом ввода и желаемым выходом, которые можно использовать для тестирования и проверки возможных решений. Убедитесь, что все термины, такие как num_of_vertices и g, определены.   -  person MrFlick    schedule 03.03.2018


Ответы (1)


Ваш код ссылается на файл "grph.graphml", которого у нас нет, поэтому я не могу использовать ваш пример. Вместо этого я буду использовать случайный график для иллюстрации.

## Generate random graph
library(igraph)
set.seed(1234)
g = erdos.renyi.game(15, 0.2)

## Your code to generate labels
random_list <- sample(c(TRUE,FALSE), gorder(g), TRUE) 
V(g)$label <- random_list

Вы можете написать небольшую функцию, чтобы проверить, имеют ли концы ребра одинаковые метки, и применить ее ко всем ребрам. Затем удалите те, у которых оба конца совпадают.

SameLabel = function(e) {
    V(g)[ends(g, e)[1]]$label == V(g)[ends(g, e)[2]]$label }
g2 = delete_edges(g, which(sapply(E(g), SameLabel)))

Вы можете проверить правильность своих действий, построив график.

set.seed(1066)
LO = layout_with_fr(g)
par(mfrow=c(1,2), mar=c(1,1,1,1))
plot(g, layout=LO, frame=TRUE)
plot(g2, layout=LO, frame=TRUE)

сокращенный график

Некоторые из них выглядят неправильно, потому что связи между удаленными узлами идут позади других узлов противоположного типа.

person G5W    schedule 02.03.2018