计算在 R iGraph 中包含边的三角形

Counting triangles that include an edge in R iGraph

iGraph 可以使用 igraph::count_triangles() 计算包含每个顶点的三角形的数量。是否有类似的函数可以为边缘提供此计数,或者使用 igraph::triangles() 的输出来执行此操作的有效方法?

我怀疑您可能必须自己实现它。下面的代码可能会给你一些提示

aggregate(
  cnt ~ .,
  cbind(
    data.frame(
      do.call(
        rbind,
        unlist(
          apply(
            matrix(triangles(kite), nrow = 3),
            2,
            function(x) combn(sort(x), 2, simplify = FALSE),
            simplify = FALSE
          ),
          recursive = FALSE
        )
      ),
      cnt = 1
    )
  ), sum
)

subset(
  as.data.frame(
  table(
    data.frame(
      do.call(
        rbind,
        unlist(
          apply(
            matrix(triangles(kite), nrow = 3),
            2,
            function(x) combn(sort(x), 2, simplify = FALSE),
            simplify = FALSE
          ),
          recursive = FALSE
        )
      )
    )
  )
), Freq > 0)

它给出了如下所示的 data.frame

   X1 X2 cnt
1   1  2   1
2   1  3   2
3   1  4   3
4   2  4   3
5   3  4   2
6   2  5   2
7   4  5   2
8   1  6   2
9   3  6   2
10  4  6   3
11  2  7   2
12  4  7   3
13  5  7   2
14  6  7   2
15  6  8   1
16  7  8   1

虚拟数据

kite <- make_graph("Krackhardt_Kite")

我认为@ThomasIsCoding 的代码中有错字。具体来说,, simplify = FALSE) 出现了两次。更正此问题,并添加几行以添加三角形计数作为 igraph 边权重给出:

triangles <- subset(as.data.frame(table(data.frame(do.call(rbind,unlist(apply(matrix(igraph::triangles(G), nrow = 3), 2, function(x) combn(sort(x), 2, simplify = FALSE)),recursive = FALSE))))), Freq > 0)
    triangles$edge <- igraph::get.edge.ids(G, as.numeric(as.vector(unlist(t(triangles[,1:2])))))
    igraph::E(G)$weight <- 0
    igraph::E(G)$weight[triangles$edge] <- triangles$Freq[triangles$edge]

这似乎相当快,即使对于大型密集图也是如此。