这个问题几乎让我发疯。首先说我有一个示例定向图表,如:
g <- sample_gnp(20000, 0.1, directed = T)
现在我想计算一个所有传出边缘的“相互边缘”的比例。这是我想到的最快的方式:
ael <- as_adj_edge_list(graph, mode = "out")
sapply(ael, function(x) {mean(which_mutual(g, x))})
然而,as_adj_edge_list
功能似乎需要无休止的时间。我的真实数据有大约23k个顶点和110k边缘,所以我不能只设置并等待代码完成。此外,通过搜索SO帖子,我发现as_adj_edge_list
已经是迭代顶点或边缘的最快方法。那么我用愚蠢的方式吗?提前谢谢了。
答案 0 :(得分:0)
如果转换模式为“相互”,则相互的egdes对应于图g.undir
的无向版本g.dir
的边缘。然后找出出局边缘之间的相互边缘的比例作为比率
g.dundir /'outgoing'-degree in g.dir
library(igraph)
g.dir <- sample_gnp(1000, 0.1, directed = T)
#-----------------------------------------
system.time(
{
ael <- as_adj_edge_list(g.dir, mode = "out")
A <- sapply(ael, function(x) {mean(which_mutual(g.dir, x))})
})
#-----------------------------------------
system.time(
{
g.undir <- as.undirected(g.dir,mode="mutual")
d.dir <- degree(g.dir,mode="out")
d.undir <- degree(g.undir)
B <- d.undir/d.dir
})
identical(A,B)
> library(igraph)
> g.dir <- sample_gnp(1000, 0.1, directed = T)
> #-----------------------------------------
>
> system.time(
+ {
+ ael <- as_adj_edge_list(g.dir, mode = "out")
+ A <- sapply(ael, function(x) { .... [TRUNCATED]
user system elapsed
11.93 0.00 12.04
> #-----------------------------------------
>
> system.time(
+ {
+ g.undir <- as.undirected(g.dir,mode="mutual")
+ d.dir <- degree(g.dir,mode .... [TRUNCATED]
user system elapsed
0 0 0
> identical(A,B)
[1] TRUE
>