r从邻接列表创建邻接矩阵或边缘列表

时间:2017-11-13 03:37:26

标签: r networking igraph adjacency-matrix adjacency-list

我有一个邻接列表,我试图将其纳入和邻接矩阵或边缘列表。这是为了在从邻接矩阵或边缘列表构建的网络上进行网络分析。我在用R. 邻接列表的示例如下(每行具有不同的条目量,并且空条目是NA):

[17,50,90,NA,NA;
80,67,NA,NA,NA;
33,31,32, NA,NA;
33,31,32,NA,NA;
354,56,87,97,32;
....]

我尝试使用R: Adjacency list to Adjacency matrix但这仅在我的邻接列表有两个条目(即组中有两个以上的邻居)时才有效。我得到了一个边缘列表,但只考虑了我列表中的前两个条目。

我也尝试使用From list to adjacency matrix,但使用igraphmake_graph(unlist(mydata))导致了错误:"At type_indexededgelist.c:117 : cannot create empty graph with negative number of vertices, Invalid value"

我需要一个邻接矩阵,它考虑了网络中的权重(如果条目31和32是两行,那么它们的边权重将是2)。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

  

我有一个邻接列表,我正试图把它变成一个边缘列表。

也许你可以做到

lst <- read.csv(header=F, comment.char=";", colClasses="integer", text="
17,50,90,NA,NA;
80,67,NA,NA,NA;
33,31,32,NA,NA;
33,31,32,NA,NA;
354,56,87,97,32;")
m <- as.matrix(lst)
e <- stack(split(m, row(m)))[,2:1]
(e <- e[complete.cases(e),])
# 1    1     17
# 2    1     50
# 3    1     90
# 6    2     80
# 7    2     67
# 11   3     33
# 12   3     31
# 13   3     32
# 16   4     33
# 17   4     31
# 18   4     32
# 21   5    354
# 22   5     56
# 23   5     87
# 24   5     97
# 25   5     32

e <- apply(lst, 1, function(x)x[!is.na(x)])
(e <- do.call(rbind, lapply(e, embed, 2))[,2:1])
#      [,1] [,2]
# [1,]   17   50
# [2,]   50   90
# [3,]   80   67
# [4,]   33   31
# [5,]   31   32
# [6,]   33   31
# [7,]   31   32
# [8,]  354   56
# [9,]   56   87
# [10,]   87   97
# [11,]   97   32

取决于您的需要/您的“邻接列表”代表什么。