Подсчет неориентированных ребер между любыми двумя узлами - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь сгенерировать список ребер для подачи в igraph функцию построения графика R, которая требует, чтобы я сгенерировал цель data.frame ', состоящую из двух столбцов, представляющих «от» узла и «до» узла с другими столбцами выступающий в качестве атрибутов ребра.

Так как здесь интерес представляет только неориентированный граф, мне нужно сгенерировать кадр данных из двух столбцов, состоящий из уникальной комбинации любых двух узлов (без порядка) и сгенерировать сумму всех ребер между ними (опять же, неориентированных).

Я ссылался на ряд более ранних потоков, но, похоже, не могу обойти проблему подсчета, потому что большинство кодов рассматривают A -> B и B <- A как разные пары, например: </p>

library(igraph)
# generate 7 edge pairs
ee <- c("A", "B", "B", "A", "C", "A", "C", "D", "D", "E", "A", "E", "A", "C")
# convert to igraph object
g <- graph(ee)

# count edges

edge.count <- function(g){
     D <- data.frame(get.edgelist(g))  # convert to data frame
     ones <- rep(1, nrow(D))   # a column of 1s
     result <- aggregate(ones, by = as.list(D), FUN = sum)
     names(result) <- c("from", "to", "count")
     result
} 

count <- edge.count(g)

count
  from to count
1    B  A     1
2    C  A     1
3    A  B     1
4    C  D     1
5    A  E     1
6    D  E     1
7    A  C     1

Но мой желаемый вывод должен иметь пару {B, A} с count из 2 и пару {C, A} с count из 2, поскольку они рассматриваются как одинаковые с парой {A, B} и {A, C} в неориентированном графе.

Может кто-нибудь порекомендовать какой-нибудь способ решить эту проблему?

1 Ответ

3 голосов
/ 29 июня 2019

Вы можете заменить graph() на make_undirected_graph():

g <- make_undirected_graph(ee)

, получив:

  from to count
1    A  B     2
2    A  C     2
3    C  D     1
4    A  E     1
5    D  E     1

Или даже на:

g <- graph(ee, directed = FALSE)
...