使用 igraph 从大型 csv 数据集创建邻接网络矩阵(或列表)
creating adjacency network matrix (or list) from large csv dataset using igraph
我正在尝试在 igraph 中进行网络分析,但是在将我拥有的数据集转换为边缘列表(具有权重)时遇到了一些问题,因为列数不同。
数据集如下所示(当然要大得多):首先是主要运营商 ID(主要运营商也可以是合作伙伴,反之亦然,因此 ID 在邻接中保持不变)挑战在于合作伙伴的数量各不相同(从 0 到 40)。
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
. .
有没有人知道最好的路线是什么?非常感谢!
这是一个经典的重塑任务。您可以为此使用 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
我正在尝试在 igraph 中进行网络分析,但是在将我拥有的数据集转换为边缘列表(具有权重)时遇到了一些问题,因为列数不同。
数据集如下所示(当然要大得多):首先是主要运营商 ID(主要运营商也可以是合作伙伴,反之亦然,因此 ID 在邻接中保持不变)挑战在于合作伙伴的数量各不相同(从 0 到 40)。
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
. .
有没有人知道最好的路线是什么?非常感谢!
这是一个经典的重塑任务。您可以为此使用 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