我正在使用R中的一个加权无向网络.我有一个直接连接的边的列表以及它们之间的权重.权重表示顶点之间的距离.我想要列出所有顶点之间的路径距离.我的数据是这样的:
library(dplyr)
library(igraph)
set.seed(123)
edgelist <- data.frame(
node1 = sample(1:10, 30, replace = T),
node2 = sample(1:10, 30, replace = T),
weight = runif(30, min = 0, max = 5)
)
igraph::distances()
将创建路径长度矩阵.
g <- graph_from_data_frame(edgelist, directed = F)
dm <- distances(g, weight = E(g)$weight)
然而,这在我的情况下是不可取的,因为我有29000个 node ,一个有8亿个单元的矩阵太重了.我可以忽略对角线,因为 node 不是自连接的,而且由于网络是无向的,我只需要矩阵的上(或下)三角形.因此,为了减少计算时间,我想要一个数据.frame或类似的对象类型,其中有3列:'verticeA','verticeB','verticeA和verticeB之间的路径长度'.
考虑到最初的优势,我如何实现这一点?计算效率是这里的关键,因为我需要用很多大的边列表来做这件事.
以下是我try 的一些方法:
pl <- as.table(dm) %>%
data.frame() %>%
mutate_all(as.numeric) %>%
filter(Var1 != Var2) %>%
mutate(
verticeA = pmin(Var1, Var2),
verticeB = pmax(Var1, Var2)
) %>%
select(-Var1, -Var2) %>%
distinct(verticeA, verticeB, .keep_all = T) %>%
rename(distance = Freq)
计算这个会让R冻结,可能是因为我的数据太大了.
ut <- dm[upper.tri((dm))]
检索上面的三角形,我认为它可以与colnames(dm)
和rownames(dm)
组合使用,但我不太清楚如何使用.