我在邻接列表中有友情数据。样本中的每个人(用id表示)最多可以提名5个朋友(f1-f5)。名为“net_test”的数据框如下所示:
id f1 f2 f3 f4 f5
1 1101 1113 1112 NA NA NA
2 1102 1111 1113 1103 1105 NA
3 1103 1105 1110 NA NA NA
4 1104 1115 1106 1110 1109 1112
5 1105 1103 1109 1116 1101 NA
6 1106 1121 1103 1113 NA NA
7 1107 1106 1111 NA NA NA
8 1108 1104 1109 NA NA NA
9 1109 1114 1103 1113 1108 1120
10 1110 1101 1103 1109 1107 NA
第一行是列号。根据这些数据,我想生成一个邻接矩阵,其中id为行名和列名,如果两个id有友谊链接,则生成条目1。我首先尝试将其保存为图形,然后在第二步中生成邻接矩阵:
require(igraph)
netdat<-graph.adjlist(net_test, mode="out", duplicate=FALSE)
adjmat <- get.adjacency(netdat, type="both")
当我应用graph.adjlist命令时,会发生以下错误:
At structure_generators.c:84 : Invalid (negative) vertex id, Invalid vertex id
是否有另一种方法将邻接列表转换为邻接矩阵?
答案 0 :(得分:3)
你误解了这些命令。命令get.adjlist
将igraph图形对象作为参数,并返回图形的列表类型对象表示。您正在将此应用于未被强制转换为igraph对象的数据框。
下面是使用数据框构建igraph图形对象的正确方法,以及如何获得该对象的各种图形表示。
require(reshape2)
net_list <- melt( net_test, id.vars = "id")
net_list <- net_list[ !is.na(net_list$value), c("id", "value") ]
graph_o <- graph.data.frame(net_list) #This is a proper igraph graph object
#got from a data frame directly
list_rep <- get.adjlist(graph_o) #this now returns an adjacency list
#representation of your graph
matrix_rep <- get.adjacency(graph_o) #this gives you the adjacency
#matrix as a (sparse) matrix with the row and column names as you want.
答案 1 :(得分:0)
我想问题是,net_test
没有合适的邻接列表,因为它包含的不仅仅是两列。所以我要做的第一件事就是通过熔化将它带到这种形式:
require(reshape2)
net_list <- melt( net_test, id.vars = "id")
net_list <- net_list[ !is.na(net_list$value), c("id", "value") ]
colnames(net_list) <- c("from", "to")
graph.adjlist(net_list, mode="out", duplicate=FALSE)
# IGRAPH D--- 1121 66 --
如果你只需要邻接矩阵而不需要igraph,你可以直接cast
熔化net_list
acast(net_list, from ~ to, fun.aggregate = length )