如何在R中使用line.graph(igraph)将顶点转换为边时计算新的边权重?

时间:2015-03-06 01:12:33

标签: r igraph

我正在尝试使用line.graph将边缘转换为节点。我的第一个图表有每个边缘的权重,我试图通过以下方式在新图表上获得权重 -

第一张图 -

1 -------(0.7)----- ----- 2(0.5) - - - - 3

新图表 -

1,2- -------(0.35)-------- 2,3

因此,第一个图的顶点是1,2和3. 1-2的边缘权重是0.7,2-3的边缘权重是0.5。在新图中我有顶点(1,2)和(2,3),连接它们的边有0.35的权重,即边权重的乘积(0.7 * 0.5)。

我怎么能在igraph中做到这一点?

1 个答案:

答案 0 :(得分:2)

基本上,我会将用于计算新图的算法总结为:

  1. 在新图表中为原始图表中的每个边缘创建一个节点
  2. 如果新图中的一对节点在原始图中共享一个节点(也就是说它们被映射到原始图中的相邻边),则在它们之间添加一个等于映射边权重乘积的边。
  3. 我将采用的方法是循环原始图中的节点,为与该节点相邻的每对边添加新图的边:

    # Sample graph (from comments on original question)
    library(igraph)
    g <- graph.data.frame(data.frame(x=1:3, y=2:4, weight=c(0.7, 0.5, 0.2)))
    
    # Build new graph from edge list
    g.edges <- get.edges(g, E(g))
    enames <- paste(g.edges[,1], g.edges[,2], sep=",")
    ewts <- E(g)$weight
    (new.edges <- do.call(rbind, sapply(1:vcount(g), function(x) {
      incident <- which(g.edges[,1] == x | g.edges[,2] == x)
      if (length(incident) <= 1) {
        return(NULL)
      } else {
        all.comb <- combn(incident, 2)
        return(data.frame(x=enames[all.comb[1,]], y=enames[all.comb[2,]], weight=apply(all.comb, 2, function(x) prod(ewts[x]))))
      }
    })))
    #     x   y weight
    # 1 1,2 2,3   0.35
    # 2 2,3 3,4   0.10
    

    您可以使用graph.data.frame(new.edges)构建新图表。