Как мне найти вершины в графе, у которых есть одна ступень, но нет в градусах? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть неориентированная сеть документов, которые все ссылаются друг на друга. Я хочу найти документы / узлы / вершины, которые имеют одну «степень выхода» (то есть, они ссылаются на одну статью), но не «в градусах» (они ни на кого не ссылаются).

Это кажется очень простым вопросом, но я не смог найти ответ где-нибудь о переполнении стека / inte rnet ..

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: Чтобы привести пример, список ребер с одной степенью и без степени выглядит следующим образом:

Paper1 -> Paper3
Paper2 -> Paper3
Paper4 -> Paper1
Paper1 -> Paper4
Paper5 -> Paper1
Paper6 -> Paper4

В этом примере я просто хочу узнать идентичность Paper5 и Paper6, которые ссылаются на одну бумагу, но не цитируются. Это не должно быть в списке границ (хотя это также хорошо, если это). Итак, желаемый результат:

identified_papers <- c("Paper5", "Paper6")

1 Ответ

1 голос
/ 11 февраля 2020

Это относительно простая задача, если вы располагаете данными в подходящем формате, например, в списке краев:

from <- c("Paper1", "Paper2", "Paper4", "Paper1", "Paper5", "Paper6")
to <- c("Paper3", "Paper3", "Paper1", "Paper4", "Paper1", "Paper4")
edgelist <- cbind(from, to)

> edgelist
     from     to      
[1,] "Paper1" "Paper3"
[2,] "Paper2" "Paper3"
[3,] "Paper4" "Paper1"
[4,] "Paper1" "Paper4"
[5,] "Paper5" "Paper1"
[6,] "Paper6" "Paper4"

Используя igraph, можно создать график из edgelist

library(igraph)
g <- graph_from_edgelist(edgelist)

Используйте функцию degree, чтобы получить степень и указать, нужно ли считать в или в градусах, установив параметр mode:

> degree(g, mode = "in")
  Paper1 Paper3 Paper2 Paper4 Paper5 Paper6 
     2      2      0      2      0      0 

> degree(g, mode = "out")
  Paper1 Paper3 Paper2 Paper4 Paper5 Paper6 
     2      0      1      1      1      1

Оттуда можно объединить запрос условия внутри which, чтобы соответствовать требованиям и извлечь соответствующую бумагу, используя names:

hits <- which(degree(g, mode = "in") == 0 & degree(g, mode = "out") == 1)
identified_papers <- names(hits)

> identified_papers
  [1] "Paper2" "Paper5" "Paper6"

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

...