Создание сетевой матрицы (или списка) смежности из большого набора данных 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