计算在 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]
这似乎相当快,即使对于大型密集图也是如此。
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]
这似乎相当快,即使对于大型密集图也是如此。