проблема с функцией степени igraph () - PullRequest
2 голосов
/ 09 марта 2012

У меня есть таблица целых чисел N x 2, называемая games [,].Таблица узлов / ребер преобразуется в график:

net <- graph.data.frame(as.data.frame(games), directed=FALSE)
deg.net <- degree(net, mode='total', loops=FALSE) 

(я понимаю, что не все опции необходимы.)

Проблема, с которой я сталкиваюсь, заключается в том, что распределение степеней кажетсябыть только в степени.Например, в файле игр есть строки:

103 86
24 103
103 2
92 103
87 103
103 101
103 44

, и все же igraph указывает, что степень для узла 103 равна «3», когда она должна быть «7».

Любое понимание того, что мне не хватает, будет оценено.

Ответы [ 2 ]

6 голосов
/ 10 марта 2012

Следует иметь в виду, что большинство функций igraph ссылаются на вершины по их идентификаторам, которые являются просто целыми числами от 0 до N-1, где N - это число вершин в графе. Если у вас есть таблица целых чисел N x 2 (содержащая нулевые индексы вершин) и вы хотите, чтобы igraph использовал целые числа в качестве идентификаторов вершин, вы можете просто использовать конструктор graph после того, как матрица сглажена в вектор по строкам , Когда вы используете graph.data.frame, предполагается, что первые два столбца фрейма данных содержат символическую вершину names (т.е. не требуется, чтобы они были целыми числами); они будут назначены атрибуту вершины name, и igraph просто составит идентификаторы от 0 до N-1.

Итак, давайте предположим, что у вас есть матрица N x 2, по одной строке на каждое ребро:

> edges <- matrix(c(103, 86, 24, 103, 103, 2, 92, 103, 87, 103, 103, 101, 103, 44), ncol=2, byrow=T)

Сначала мы создадим из него график после выравнивания матрицы по строкам:

> g <- graph(as.vector(t(edges)))

Это дает вам ориентированный граф с 7 ребрами, и выход / в градусах вершины 103 будет таким, как ожидалось:

> ecount(g)
7
> degree(g, 103, mode="out")
4
> degree(g, 103, mode="in")
3
> degree(g, 103, mode="all")
7

Если вы используете graph.data.frame с вышеуказанной матрицей, igraph создаст график, где числа в матрице хранятся в атрибуте вершины name:

> g <- graph.data.frame(as.data.frame(edges))
> V(g)$name
[1] "103" "24"  "92"  "87"  "86"  "2"   "101" "44"

Это показывает, что вершина с именем 103 фактически стала нулевой вершиной на графике:

> degree(g, 0, mode="out")
4
> degree(g, 0, mode="in")
3
> degree(g, 0, mode="all")
7

Насколько я знаю, degree также может работать с именами вершин напрямую, если в графе есть атрибут вершины с именем name, так что вы также можете сделать это:

> degree(g, "103", mode="in")
3

Надеюсь, это поможет.

1 голос
/ 10 марта 2012

Вы создали неориентированный граф. В таком графике нет степени входа и выхода. Из документации igraph ссылка вы можете получить общее представление. Ваш deg.net вернет вектор со всеми градусами (на узел) на вашем графике, подобный этому:

[1] 2 1 1 1 1 1 1

Если вы хотите получить степень определенного узла (в нашем примере это 103), вам нужно указать узел (appearence_order-1). В вашем примере вы ищете (1st_node-1), это узел 0. Поэтому вы должны ввести:

градус (net, 0, mode = 'total', loop = FALSE)

Который будет возвращать степень узла 0, "7".

...