如何仅从同构三角形集中返回一个三角形?

时间:2019-08-23 08:33:06

标签: r igraph isomorphism

最初的问题是here

  

如何计算具有6个顶点和5个图的图的概率   边缘有一个三角形?

我想进行模拟。我将创建triangle图,然后生成具有1,000顶点和n=6边的m=5随机图,并找到三角形的分布。

现在,我创建了一个带有一个三角形的g图,subgraph_isomorphisms()函数返回了6个同构三角形。 然后,我使用unique()函数来找到一个三角形。 但是结果是6

library(igraph) 

g          <- graph_from_literal( A--B, B--C, C--A, B--D, D--E, E--F)
triangle   <- graph_from_literal( A--B, B--C, C--A) 

ntriangles <- 0

iso <- subgraph_isomorphisms(triangle, g) 

motifs <- lapply(iso, function (x) { induced_subgraph(g, x) }) 
ntriangles <- length(unique(motifs))  
ntriangles

问题。 如何仅从同构三角形集中返回一个三角形?

1 个答案:

答案 0 :(得分:1)

一种解决方案可能是将每个主题的边缘列表聚合到data.frame中,并使用dplyr的{​​{1}}来过滤唯一值:

distinct

这将返回:

library(dplyr)
edgelist <- do.call(rbind,
                    lapply(1:length(motifs), function(x) get.edgelist(motifs[[x]])))
edgelist <- data.frame(edgelist) %>% distinct() %>% as.matrix()
graph_from_edgelist(edgelist, directed = F)

编辑这是另一种方法,它更短,更接近建议的OP:

> graph_from_edgelist(edgelist, directed = F)
IGRAPH e275587 UN-- 3 3 -- 
+ attr: name (v/c)
+ edges from e275587 (vertex names):
[1] A--B A--C B--C

在这里,我只是提取包含顶点的边列表。没有唯一的motifs <- lapply(iso, function (x) { get.edgelist(induced_subgraph(g, x)) }) ntriangles <- length(unique(motifs)) ntriangles 和其他信息存储在igraph对象中,graph_id将返回以下内容:

unique