如何创建从边缘列表的加权邻接表/矩阵?(How to create weighted adjacen

2019-09-03 15:52发布

我的问题很简单:我需要从边缘的列表中创建一个邻接表/矩阵。

我有存储有列1 = node1和列2 =节点2一个csv文件中的边缘列表以及我想将此转换为加权邻接列表或加权邻接矩阵。

更精确地说,这里的数据看起来像-where数字只是节点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

如何实现从这个转换为加权邻接表/矩阵任何提示? 这是我如何解决以前做的,没有成功(礼貌戴静香 ):

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'

谢谢!

Answer 1:

这种反应只使用基础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

如果您EdgeList都包括权重,那么你需要一个稍微不同的解决方案。

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

UPDATE

一段时间后,我意识到,在先前的加权EdgeList都例如环(第3行)是不必要的。 你可以用下面的量化操作替换它:

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


Answer 2:

你的问题(更不用说在我的网站后https://sites.google.com/site/daishizuka/toolkits/sna/sna_data )使用的igraph包,所以要确保被加载。

此外,我最近意识到的igraph提供了一种更简单的方法来创建从edgelists加权邻接矩阵,使用graph.data.frame()。 我已经在我的网站更新,这一点,但这里是一个简单的例子:

library(igraph)
el=matrix(c('a','b','c','d','a','d','a','b','c','d'),ncol=2,byrow=TRUE) #a sample edgelist
g=graph.data.frame(el)
get.adjacency(g,sparse=FALSE)

这应该这样做。 稀疏= FALSE参数告诉它显示在邻接矩阵的0。 如果你真的不想使用的igraph,我觉得这是做一个笨重的办法:

el=matrix(c('a','b','c','d','a','d','a','b','c','d'),ncol=2,byrow=TRUE) #a sample edgelist
lab=names(table(el)) #extract the existing node IDs
mat=matrix(0,nrow=length(lab),ncol=length(lab),dimnames=list(lab,lab)) #create a matrix of 0s with the node IDs as rows and columns
for (i in 1:nrow(el)) mat[el[i,1],el[i,2]]=mat[el[i,1],el[i,2]]+1 #for each row in the edgelist, find the appropriate cell in the empty matrix and add 1.


Answer 3:

开始与您的数据帧的边缘和使用的igraph获得邻接矩阵:

头(边缘)

  node1 node2
1   551   548
2   510   512
3   548   553
4   505   504
5   510   512
6   552   543

library(igraph)
as.matrix(get.adjacency(graph.data.frame(edges)))

    551 510 548 505 552 512 543 553 504 547 542
551   0   0   2   0   0   0   0   0   0   0   0
510   0   0   0   0   0   2   0   0   0   0   0
548   0   0   0   0   0   0   2   1   0   0   1
505   0   0   0   0   0   0   0   0   1   0   0
552   0   0   0   0   0   0   1   0   0   0   0
512   0   2   0   0   0   0   0   0   0   0   0
543   0   0   1   0   0   0   0   0   0   1   0
553   0   0   0   0   0   0   0   0   0   0   0
504   0   0   0   0   0   0   0   0   0   0   0
547   0   0   0   0   0   0   0   0   0   0   0
542   0   0   0   0   0   0   0   0   0   0   0


Answer 4:

qdapTools包装的另一个可能性:

library(qdapTools)

el[rep(seq_len(nrow(el)), el[,'c']), c('a', 'b')] %>%
    {split(.[,'b'], .[,'a'])} %>%
    mtabulate()

##   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


文章来源: How to create weighted adjacency list/matrix from edge list?