如何从一组同构三角形中 return 只有一个三角形?

How to return only one triangle from the set of isomorphic triangles?

原题是here.

How to calcultate a probability that a graph with 6 vertices and 5 edges has a triangle?

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

现在我用一个三角形创建了一个 g 图,subgraph_isomorphisms() 函数 returns 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

问题。 如何 return 一组同构三角形中只有一个三角形?

一种解决方案是将每个基序的边缘列表聚合成一个 data.frame 并使用 dplyrdistinct 来过滤唯一值:

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)

这return秒:

> 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

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

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

这里我只是提取了包含顶点的边列表。如果没有唯一的 graph_id 和存储在 igraph 对象中的其他信息,unique 将 return 以下内容:

> length(unique(motifs))
[1] 1