igraph将并行边转换为权重属性

15

我正在使用R语言的igraph包。我的图基于一个边缘列表,其中包括平行边(即多个具有相同源和目标的边)。我想将这些平行边转换为边属性权重。是否有简单的方法可以实现这一点?

如果没有简单的方法,我该如何识别这些平行边?

    duplicated(E(net))

该函数不返回重复项,我猜它是在寻找重复的边缘ID。

3个回答

29

您还可以使用 E(graph)$weight <- 1,然后跟随 simplify(graph, edge.attr.comb=list(weight="sum")) 来为每个边分配权重1,然后将多个边合并成单个边并将权重相加。


4
这个解决方案实际上更好,因为它使用线性的空间和时间,而邻接矩阵解决方案则使用二次(相对于顶点数量)的空间和时间。 - Gabor Csardi
2
顺便提一下,这也会消除循环边,所以如果不想要的话,请使用 simplify() 中的 remove.loops=FALSE 参数。 - Gabor Csardi

5

似乎在 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)

这是一个非常适用于大型图形的非常有帮助的解决方案。 - timothyjgraham

1

如果您想获取图形的平行边数量,但不想向图形添加权重属性,则可以使用以下函数:

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))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接