从图中创建边缘列表,包含所有可能的顶点组合

时间:2018-06-12 11:35:00

标签: r igraph

我想将图表转换为边缘列表。这可以使用get.edgelist函数完成。问题是此函数仅在连接的节点之间生成边缘列表连接。我需要一个带有所有潜在节点组合的边缘列表,而不仅仅是已连接的节点。请看以下示例:

set.seed(1234)
g <- sample_gnm(n=20,m=20)
E(g)$weight <- sample(20)
plot(g)

enter image description here

现在我创建一个包含第三列中每个连接的重量的边缘列表。

cbind(get.edgelist(g,names=TRUE),E(g)$weight)

      [,1] [,2] [,3]
 [1,]    3    5    4
 [2,]    1    7   11
 [3,]    1    8   16
 [4,]    3    9    8
 [5,]    1   10   12
 [6,]    4   10    1
 [7,]    7   12    7
 [8,]    2   13   10
 [9,]    6   13   14
[10,]   11   14    2
[11,]    3   15    3
[12,]   14   15   13
[13,]    2   16    9
[14,]   15   16   17
[15,]    1   17    5
[16,]   11   17   20
[17,]    6   18    6
[18,]    2   19   18
[19,]   14   19   15
[20,]   14   20   19

此结果并不令人满意,因为它为我提供了节点的实际组合,但并未提供节点的所有潜在组合。例如,节点4和5未在图中连接,因此不会出现在edgelist的同一行中。在理想的世界中,我将得到所有可能的组合,包括节点4和5,在第三列中边缘权重为零。任何人?

1 个答案:

答案 0 :(得分:1)

您可以尝试tidyverse使用complete获取连续数据,并使用V3填充0。最后过滤掉“自我边缘”。

library(tidyverse)
cbind(get.edgelist(g,names=TRUE),E(g)$weight) %>% 
  as.tibble() %>% 
  complete(V1=1:20, V2=1:20, fill = list(V3 = 0)) %>% 
  filter(V1 != V2)
# A tibble: 380 x 3
      V1    V2    V3
   <dbl> <dbl> <dbl>
 1     1     2     0
 2     1     3     0
 3     1     4     0
 4     1     5     0
 5     1     6     0
 6     1     7     0
 7     1     8    13
 8     1     9     0
 9     1    10     0
10     1    11     0
# ... with 370 more rows