igraph генерирует матрицу смежности из списка смежности
У меня есть данные о дружбе в списке соседей. Каждый человек в выборке (обозначенный 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
Первая строка - это номер столбца. Из этих данных я хотел бы сгенерировать матрицу смежности с идентификаторами в качестве имен строк и столбцов и записями 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
Был бы другой способ преобразовать список смежности в матрицу смежности?
2 ответа
Вы неправильно поняли команды. Команда 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.
Я думаю, проблема в том, что 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 )