如何解决计算包含 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),simplify = FALSE),simplify = FALSE
),recursive = FALSE
)
),cnt = 1
)
),sum
)
或
subset(
as.data.frame(
table(
data.frame(
do.call(
rbind,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),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]
这似乎相当快,即使对于大型密集图也是如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。