Создание сетевой матрицы (или списка) смежности из большого набора данных csv с помощью igraph

Я пытаюсь выполнить сетевой анализ в igraph, но у меня есть некоторые проблемы с преобразованием моего набора данных в список ребер (с весами), учитывая различное количество столбцов.

Набор данных выглядит следующим образом (гораздо больше, конечно): во-первых, это основной идентификатор оператора (основной оператор также может быть партнером, и наоборот, поэтому идентификаторы остаются неизменными в смежности). Проблема заключается в том, что количество партнеров варьируется (от 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
.   .

У кого-нибудь есть совет, какой лучший способ пойти? Спасибо заранее!

1 ответ

Решение

Это классическая задача по изменению формы. Вы можете использовать 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
Другие вопросы по тегам