我想将图表转换为边缘列表。这可以使用get.edgelist
函数完成。问题是此函数仅在连接的节点之间生成边缘列表连接。我需要一个带有所有潜在节点组合的边缘列表,而不仅仅是已连接的节点。请看以下示例:
set.seed(1234)
g <- sample_gnm(n=20,m=20)
E(g)$weight <- sample(20)
plot(g)
现在我创建一个包含第三列中每个连接的重量的边缘列表。
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,在第三列中边缘权重为零。任何人?
答案 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