Функция соседи в пакете igraph в R

Прежде всего хочу сказать, что я уже прочитал ответы на вопрос: «Проблемы с функцией соседа пакета R« igraph »» и я попытался решить свою проблему, но не смог. Я попытался задать свой вопрос в качестве дополнительного комментария, но из-за низкого уровня репутации не смог, поэтому открываю этот новый вопрос. Теперь вот мой вопрос: у меня такая же проблема с функцией соседей, как это было объяснено в: соседняя функция пакета" igraph ", но когда я пробую решение, предоставленное Габором Чарди Я только что получил null. Я приложил сюда и эту часть своего кода. Буду очень благодарен за любую помощь и ответ. Моя таблица:

edgelist <- read.table(text = "
1 2
2 3
3 4
4 5
3 6
6 7")
library(igraph)
graph <- graph.data.frame(edgelist)

str(graph)
## IGRAPH DN-- 7 6 -- 
## + attr: name (v/c)
## + edges (vertex names):
## [1] 1->2 2->3 3->4 4->5 3->6 6->7

теперь, если я хочу, чтобы соседи узла 3 были

2, 4, 6

но результат, который я получил:

2, 4, 5

Я заметил, что это изменило порядок моих узлов. Как я уже объяснял, я пробую решение, которое нашел при переполнении стека, но в результате получил ноль:

graph$name[neighbors(graph, 3)]
   NULL

Я не знаю, что еще я могу сделать, буду признателен за любую помощь.


person tolou    schedule 17.03.2015    source источник


Ответы (2)


Прежде чем мы начнем, вы должны быть осторожны, чтобы не перепутать метку / имя и индекс / номер данной вершины. Когда вы используете оба числа для обозначений и обозначений, все быстро сбивает с толку. Чтобы избежать путаницы, я использовал буквы

edgelist <- read.table(text = "
A B
B C
C D
D E
C F
F G")  

library(igraph)
graph <- graph.data.frame(edgelist)
str(graph)
#IGRAPH DN-- 7 6 -- 
# + attr: name (v/c)
# + edges (vertex names):
# [1] A->B B->C C->D D->E C->F F->G

Чтобы увидеть, с чем имели дело, мы строим график:

plot(graph)

Imgur

Чтобы получить индекс соседей, сделайте что-то вроде: (помните, что есть аргумент mode)

neighbors(graph, 3, mode = "total")  # Index of neighbours by index
## [1] 2 4 5
neighbors(graph, "C", mode = "total")  # Index of neighbours by label
## [1] 2 4 5

Чтобы сделать то, что предлагает Габор, вам необходимо сделать следующее. (Я думаю, он пропустил V( ) и написал graph$name, когда имел в виду V(graph)$name в своем сообщении)

# Label of neighbours by label
V(graph)$name[neighbors(graph, "C", mode = "total")]
## [1] "B" "D" "F"

Это дает метки соответствующих «соседей». Что действительно соответствует изображению.

ИЗМЕНИТЬ. Я испортил. Используется E() вместо V(). Кажется, работает как задумано. Прости.

person Anders Ellern Bilgrau    schedule 17.03.2015

Или вы можете использовать which для получения нужного вам индекса:

neighbors(g,which(V(g)$name %in% 'A'),mode='in')
person katie lu    schedule 28.08.2015