Риграф преобразует параллельные ребра в атрибут веса

Я работаю с igraph для R. Мой график основан на списке edgelist, который включает параллельные ребра (более одного ребра с одним и тем же источником и целью). Я хотел бы преобразовать эти параллельные ребра в вес атрибута ребра. Есть ли способ сделать это?

Если нет простого пути. как я могу определить эти параллельные края?

    duplicated(E(net))

не возвращает ни одного дубликата. Я полагаю, он ищет повторяющиеся идентификаторы ребер.


person supersambo    schedule 21.10.2012    source источник


Ответы (3)


Вы также можете использовать E(graph)$weight <- 1, за которым следует simplify(graph, edge.attr.comb=list(weight="sum")), чтобы присвоить вес 1 каждому ребру, а затем свернуть несколько ребер в одиночные при суммировании весов.

person Tamás    schedule 21.10.2012
comment
Это решение на самом деле намного лучше, потому что оно использует линейное пространство и время, тогда как решение матрицы смежности использует квадратичные (с точки зрения количества вершин) пространство и время. - person Gabor Csardi; 22.10.2012
comment
Кстати. это также устраняет края цикла, поэтому, если вы этого не хотите, используйте аргумент remove.loops=FALSE для simplify(). - person Gabor Csardi; 22.10.2012

Кажется, что экспорт невзвешенного графа с параллельными ребрами в матрицу смежности в igraph создает список весов с количеством ребер в качестве веса, который затем можно прочитать снова:

library("igraph")
E <- matrix(c(1,1,1,2,2,2),3,2)
G <- graph.edgelist(E)

G2 <- graph.adjacency(get.adjacency(G),weighted=TRUE)
person Sacha Epskamp    schedule 21.10.2012
comment
Это действительно полезное решение для очень больших графиков. - person timothyjgraham; 12.09.2017

Если вы хотите получить количество параллельных ребер графа без добавления атрибута веса к вашему графу, вы можете использовать следующую функцию:

duplicated <- function(graph){
  g_local <- graph
  E(g_local)$weight <- 1
  g_simp <- simplify(g_local, edge.attr.comb=list(weight="sum"))
  w <- E(g_simp)$weight
  return(sum(w-1))
}
person Gonzalo user7334982    schedule 12.12.2017