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

Я хотел бы сгенерировать подграф первого взаимодействия из группы начальных узлов, используя в качестве источника более крупный граф. Исходный граф огромен, с более чем 300000 ребер, а мои начальные узлы составляют ~ 300. Подграф (или несколько подграфов) должен содержать первые интеракторы для каждого из начальных узлов.

Я применил код из этого сообщения Создание подграфа с использованием igraph в R, но он только дает мне большой подграф. Я ожидаю большой подграф (континент) и другие подграфы, не связанные с этим большим графом (островами).

Пример кода:

g <-erdos.renyi.game(50, 3/50)
seeds <- c(1,4,5,6,40,30)
sg <- decompose.graph(g)
neighverts <- unique(unlist(sapply(sg,FUN=function(s){if(any(V(s) %in% seeds)) V(s) else NULL})))
g1 <- induced.subgraph(graph=g,vids=neighverts)

График g1 дает мне самый большой компонент из decompose.graph. В этом графе есть мои начальные узлы и другие узлы, которые не являются первыми взаимодействующими элементами для начальных узлов. Я ищу подграф или список подграфов с начальными узлами и их первыми взаимодействующими элементами. Может стоит попробовать с neighborhood групповыми функциями?

Спасибо заранее

РЕДАКТИРОВАТЬ1:

Следуя предложению Габора, я использовал функцию neigborhood с order=1. Однако я все еще не получаю ожидаемого результата. Ниже приведен подробный пример:

mat <- structure(list(X1 = c("5203820", "9985655", "5203820", "1795907","2190697", "5203820", "3233174", "1773848", "892104", "9976862","9987167", "9987134", "1211741", "1722252", "9986835", "9986879","9986835", "61145", "3442328", "5203820", "9987075", "3442328","1773848", "119371", "9986887", "2190697", "9987032", "9974927","9986835", "892104", "3744713", "9974927", "5118892", "9987134","9987134", "3442328", "2190697", "5203820", "9985655", "9987167","9990684", "3233174", "5203820", "9990684", "3744713", "9990684","9990684", "61145", "9990684", "3442328", "5378006", "9987035","9987035", "9987088", "3442328", "5118895"), X2 = c("61145","9987167","4928047", "9975931", "3744713", "3744713", "9975931","3820326", "9987100", "9987035", "9990670", "9990670", "9984628","3588994", "9986879", "9987059", "9987059", "9978463", "9986877","1795907", "9987142", "3588994", "1211741", "2111600", "9987124","1773848", "9987228", "9987100", "3442328", "3820326", "9983385","9978897", "9987019", "9987059", "5143742", "5143742", "9983385","9978463", "9987134", "9986887", "9990684", "9990684", "9990684","5373267", "9990684", "5389588", "5389374", "9990684", "5393513","9987088", "9987088", "9987035", "5118895", "9987088", "9987035","9987088")), .Names = c("X1", "X2"), row.names = c(NA, -56L), class = "data.frame")

g <- graph.data.frame(mat, directed=F)
seeds <- c('1722252', '9990670', '3442328', '5378006', '9990684', '9978463')
g1 <- induced.subgraph(g, vids = unlist(neighborhood(g, 1, nodes = seeds)))

plot(g1)

image1.

Результат показывает границу между узлами «5143742» и «9987134». Мой ожидаемый результат - это только начальные узлы (семена) и ребра между ними и первыми взаимодействующими элементами, не включая эти ребра между первыми взаимодействующими элементами.

Спасибо еще раз


person user2380782    schedule 18.02.2015    source источник
comment
Да, использовать соседство с order = 1.   -  person Gabor Csardi    schedule 18.02.2015
comment
Спасибо @GaborCsardi, но не могли бы вы мне помочь с новым редактированием? Спасибо заранее   -  person user2380782    schedule 18.02.2015


Ответы (1)


Чтобы получить подграф индуцирования, который содержит только ребра между исходными вершинами и их первыми взаимодействующими элементами, вы можете использовать subgraph.edges, как вы указали в комментарии.

g1 <- subgraph.edges(g, unlist(get.adjedgelist(g)[seeds]) )
person ahmohamed    schedule 18.02.2015
comment
Спасибо @ahmohamed, но у моего ожидаемого результата нет границ между 5203820 и 61145 или между 514372 и 9987134. Я думаю, мне нужно использовать subgraph.edges, но не уверен - person user2380782; 18.02.2015
comment
Я переписал ответ, как вы объяснили. - person ahmohamed; 18.02.2015
comment
Спасибо @ahmohamed, это именно то, что искал. Я изо всех сил пытался получить идентификаторы ребер, но, судя по вашему ответу, это действительно просто !!! Я думаю, фокус был get.adjedgelist - person user2380782; 19.02.2015
comment
Добро пожаловать. Я отредактировал заголовок вопроса, чтобы лучше описать то, что вы хотели. - person ahmohamed; 19.02.2015