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

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

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

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

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(), Кажется, работает как задумано. Сожалею.

Или, вы можете использовать, чтобы дать вам индекс, который вы хотите:

neighbors(g,which(V(g)$name %in% 'A'),mode='in')
Другие вопросы по тегам