Функция соседей в пакете 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)
Чтобы получить индекс соседей сделать что-то вроде:
(помните, что есть 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')