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

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


person julia_3010    schedule 09.08.2017    source источник
comment
Можете ли вы попытаться перефразировать свой вопрос, чтобы прояснить, что это за набор данных, и как именно вы хотите, чтобы это было преобразовано в график? Мне трудно понять, как исходный набор данных, который вы предоставляете, будет преобразован либо в матрицу смежности, либо в предоставляемый вами список ребер. Я вижу, что матрица смежности и список ребер описывают один и тот же граф, я просто не понимаю, как исходные данные могут быть переведены в этот граф.   -  person Slow loris    schedule 09.08.2017
comment
Кроме того, даже если это не часть вашего вопроса, это не произвольный выбор, используете ли вы матрицу смежности или список ребер для описания вашего графа, поэтому вам следует подумать о своей ситуации и о том, какой из них лучше для вас stackoverflow.com/questions/2218322/   -  person Slow loris    schedule 09.08.2017
comment
спасибо @Slowloris, учитывая размер набора данных, я думаю, что список edgelist лучше. Я отредактировал вопрос сейчас и надеюсь, что в нем немного больше ясности.   -  person julia_3010    schedule 09.08.2017


Ответы (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
person Taylor H    schedule 09.08.2017
comment
большое спасибо @TaylorH! это действительно хорошо работает. одна вещь, которую я не достаточно ясно понял в своем вопросе (отредактированном сейчас), - это вес взаимодействий (список редактирования со связанными значениями). есть ли способ учесть и их? извините за добавленный вопрос и еще раз спасибо - person julia_3010; 09.08.2017
comment
@ julia_3010 как ваши веса выглядят в ваших данных? - person Taylor H; 09.08.2017
comment
структура такая же, как указано выше, но есть взаимодействия, которые повторяются, или порядок «основной» / «партнер» - наоборот (например, IdMain 1 партнеры с number 3, в другом проекте это снова то же самое или number 3 равно IdMain для этого взаимодействия, если в этом есть смысл. - person julia_3010; 10.08.2017
comment
Извините, вам нужно будет более ясным. Можете ли вы использовать dput на некоторых из ваших данных, чтобы показать пример? Или иначе создать пример фрейма данных? - person Taylor H; 10.08.2017