gpt4 book ai didi

r - 如何从边列表创建加权邻接列表/矩阵?

转载 作者:行者123 更新时间:2023-12-02 04:32:26 25 4
gpt4 key购买 nike

我的问题非常简单:我需要从边列表创建邻接列表/矩阵。

我有一个存储在 csv 文档中的边列表,其中列 1 = 节点 1 且列 2 = 节点 2,我想将其转换为加权邻接列表或加权邻接矩阵。

更准确地说,数据如下所示 - 其中数字只是节点 ID:

node1,node2
551,548
510,512
548,553
505,504
510,512
552,543
512,510
512,510
551,548
548,543
543,547
543,548
548,543
548,542

关于如何实现从这个到加权邻接列表/矩阵的转换有什么技巧吗?这就是我之前决定这样做的方法,但没有成功(由 Dai Shizuka 提供):

dat=read.csv(file.choose(),header=TRUE) # choose an edgelist in .csv file format
el=as.matrix(dat) # coerces the data into a two-column matrix format that igraph likes
el[,1]=as.character(el[,1])
el[,2]=as.character(el[,2])
g=graph.edgelist(el,directed=FALSE) # turns the edgelist into a 'graph object'

谢谢!

最佳答案

此响应仅使用基本 R。结果是用于表示邻接矩阵的标准矩阵。

 el  <- cbind(a=1:5, b=5:1) #edgelist (a=origin, b=destination)
mat <- matrix(0, 5, 5)
mat[el] <- 1
mat
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0 0 0 0 1
#[2,] 0 0 0 1 0
#[3,] 0 0 1 0 0
#[4,] 0 1 0 0 0
#[5,] 1 0 0 0 0

这里mat你的邻接矩阵是从edgelist el定义的,这是一个简单的cbind向量 1:55:1 .

如果您的边缘列表包含权重,那么您需要稍微不同的解决方案。

el <- cbind(a=1:5, b=5:1, c=c(3,1,2,1,1)) # edgelist (a=origin, b=destination, c=weight)
mat<-matrix(0, 5, 5)
for(i in 1:NROW(el)) mat[ el[i,1], el[i,2] ] <- el[i,3] # SEE UPDATE
mat
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0 0 0 0 3
#[2,] 0 0 0 1 0
#[3,] 0 0 2 0 0
#[4,] 0 1 0 0 0
#[5,] 1 0 0 0 0

更新

一段时间后,我意识到前面的加权边缘列表示例中的 for 循环(第 3 行)是不必要的。您可以将其替换为以下矢量化操作:

mat[el[,1:2]] <- el[,3]

关于r - 如何从边列表创建加权邻接列表/矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16584948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com