2016-10-19 21 views
1

Я пытаюсь преобразовать фрейм данных из онлайн-форума в социальную сеть, однако я не знаю, как преобразовать данные в матрицу смежности/край список, необходимый для анализа сети.Преобразование фрейма данных в матрицу смежности/список краев для сетевого анализа

Мой код выглядит следующим образом:

library(igraph) 
graph.data.2002 <- as.matrix(data.2002[,2:3]) 
g.2002 <- graph.data.frame(graph.data.2002, directed=FALSE) 
plot(g.2002, vertex.size = 1, vertex.label=NA) 

Я использую R для анализа. Текущая проблема заключается в том, что авторы связаны друг с другом через ThreadID, однако при проведении сетевого анализа он включает в себя ThreadID как узел. В идеале я бы хотел, чтобы список матриц смежности/края отображал 1, если автор взаимодействует со всем автором в том же потоке.

(первый раз проводки, поэтому дайте мне знать, если есть что-нибудь, что отсутствует/не правильный)

В настоящее время данные следующим образом:

ThreadID AuthorID 
659289 193537 
432269 136196 
572531 170305 
230003 32359 
459059 47875 
635953 181593 
235116 51993 
+0

Итак, вы хотите, чтобы это было как две колонки - скажем, Author1, Author2 - каждая из перечисленных пар? Пример, который вы предоставляете, не слишком информативен, поскольку каждый из авторов и нитей не связан. Можете ли вы уточнить, что вы хотите точно так же, как вывод? – thelatemail

+0

Приветствуем вас в StackOverflow. Пожалуйста, найдите время, чтобы прочитать страницу справки, особенно разделы с названием [«Какие темы можно задать здесь?»] (Http://stackoverflow.com/help/on-topic) и [«Какие типы вопросов я должен не спрашивать? "] (http://stackoverflow.com/help/dont-ask). И что еще более важно, прочитайте [контрольный список вопросов переполнения стека] (http://meta.stackexchange.com/q/156810/204922). Вы также можете узнать о [Минимальных, Полных и Подтверждаемых примерах] (http://stackoverflow.com/help/mcve). – symbolrush

+0

http://finzi.psych.upenn.edu/R/library/nettools/html/mat2adj.html –

ответ

4

Вы можете использовать inner_join, чтобы получить что-то вроде список ребер (требуется только небольшая переформатировка).

Если я правильно понять, test 1 должен иметь только одно соединение, между автором 193537 и 32359, которые были на резьбе 659289.

test1 <- data.frame(ThreadID = c(659289, 432269, 572531, 659289), 
       AuthorID = c(193537, 136196, 170305, 32359)) 
test2 <- dplyr::inner_join(test1, test1, by = "ThreadID")[,-1] 
test3 <- apply(test2, 2, as.character) #AuthorID as character will become vertex ID 

Убедитесь, что вы получите то, что вы ожидали:

library(network) 
test.network <- network(test3, directed = FALSE) 
as.sociomatrix(test.network) 
as.edgelist(test.network) 
plot(test.network, label = test.network%v%"vertex.names") 
+0

Да, это было именно то, что я был после, спасибо большое! –

+0

Эй, @SimonRicketts, если ответ сработал для вас, не забудьте принять ответ! – paqmo