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 )
Другие вопросы по тегам