2017-08-09 381 views
0

我想在igraph中进行网络分析,但在将数据集转换为边缘列表(带有权重)时存在一些问题,因为给定的数量不同列。数据集看起来如下(当然要大得多):首先是主操作员ID(主操作员也可以是合伙人,反之亦然,因此Ids在邻接中保持不变)挑战在于合作伙伴的数量有所不同(从0到40)。使用igraph创建邻接网络矩阵(或列表)igraph

IdMain IdPartner1 IdPartner2 IdPartner3 IdPartner4 ..... 
1  4   3   2   NA 
2  3   1   NA   NA 
3  1   4   7   6 
4  9   6   3   NA 
. 
. 

我的问题是如何将其转化成具有重量的边缘名单这是无向(只是表达交互):

Id1 Id2 weight 
1 2 2 
1 3 2 
1 4 1 
2 3 1  
3 4 2 
. . 

有谁有什么尖走的最好方法是什么?提前谢谢了!

+0

你可以尝试重新描述一下你的问题,使它更清楚你的数据集是什么,以及你想如何将它转换成图表?我很难看到您提供的初始数据集将如何转换为您提供的邻接矩阵或边界列表。我可以看到邻接矩阵和边界列表描述了同一个图,我只是没有看到如何将初始数据转换为该图。 –

+0

此外,即使这不是你问题的一部分,不管你使用邻接矩阵还是边缘列表来描述你的图形,都不是一个任意的选择,所以你应该考虑你的情况,哪一个更适合你https: //stackoverflow.com/questions/2218322/what-is-better-adjacency-lists-or-adjacency-matrices-for-graph-problems-in-c –

+0

谢谢@Slowloris,鉴于数据集的大小,我认为是一个边界列表更好。我现在编辑了这个问题,我希望有更多的清晰。 –

回答

1

这是一个经典的重塑任务。您可以使用reshape2包。

text <- "IdMain IdPartner1 IdPartner2 IdPartner3 IdPartner4 
1  4   3   2   NA 
2  3   NA   NA   NA 
3  1   4   7   6 
4  9   NA   NA   NA" 

data <- read.delim(text = text, sep = "") 

library(reshape2) 
data_melt <- reshape2::melt(data, id.vars = "IdMain") 
edgelist <- data_melt[!is.na(data_melt$value), c("IdMain", "value")] 

head(edgelist, 4) 
# IdMain value 
# 1  1  4 
# 2  2  3 
# 3  3  1 
# 4  4  9 
+0

非常感谢@TaylorH!这真的很好。有一件事我不清楚在我的问题(现在编辑)是交互的重量(边缘列表与关联的值)。有没有办法将它们考虑在内?对不起,增加的问题,再次感谢 –

+0

@ julia_3010你的权重如何看待你的数据? –

+0

结构如上,但有重复的交互或'主'/'合作伙伴'顺序是相反的(例如'IdMain 1'与#3合作伙伴,在另一个项目中它又是一样的或对于这种交互,'number 3'是'IdMain',如果这是有意义的话。 –