tidygraph и igraph — построить график из несоответствия фреймов данных

Я могу без проблем построить объект графа в igraph из двух фреймов данных. Когда я пытаюсь сделать то же самое в tidygraph, я получаю ошибки. Позвольте мне продемонстрировать. Сначала я загружаю свои исходные данные (данные с доски объявлений):

library(dplyr)
library(tidyr)
library(tidygraph)
library(lubridate)
library(iterpc)
library(igraph)

df <- data.frame(author_id = c(2,4,8,16,4,8,2,256,512,8),
             topic_id = c(101,101,101,101,301,301,501,501,501,501),
             time = as.POSIXct(c("2011-08-16 20:20:11", "2011-08-16 21:10:00", "2011-08-17 06:30:10",
                                 "2011-08-17 10:08:32", "2011-08-20 22:23:01","2011-08-20 23:03:03",
                                 "2011-08-25 17:05:01", "2011-08-25 19:15:10",  "2011-08-25 20:07:11",
                                 "2011-08-25 23:59:59")),
             vendor = as.logical(c("FALSE", "FALSE", "TRUE", "FALSE", "FALSE",
                                   "TRUE", "FALSE", "FALSE", "FALSE", "TRUE"))) 

Затем я создаю уникальный список узлов (люди, которые публикуют сообщения на доске объявлений):

node <- df %>% distinct(author_id, vendor) %>% rename(id = author_id) %>% mutate(vendor = as.numeric(vendor))

Затем мой список краев (людей, подключенных через ветку обсуждения (тему)):

edge <- df %>% 
  group_by(topic_id) %>% 
  do(data.frame(getall(iterpc(table(.$author_id), 2, replace =TRUE)))) %>%
  filter(X1 != X2) %>% rename(from = X1, to = X2) %>% select(to, from, topic_id)

Используя igraph, я могу создать этот объект графика:

test_net <- graph_from_data_frame(d = edge, directed = F, vertices = node)
plot(test_net)

Это выглядит хорошо. Теперь я пытаюсь сделать то же самое с tidygraph:

tidy_net <- tbl_graph(nodes = node, edges = edge, directed = F)
Error in add_vertices(gr, nrow(nodes) - gorder(gr)) : At type_indexededgelist.c:369 : cannot add negative number of vertices, Invalid value

Ой! Однако, когда я импортирую объект igraph в tidygraph:

tidy_net <- as_tbl_graph(test_net)
plot(tidy_net)

Все работает! Что здесь происходит? Пожалуйста помоги.


person aterhorst    schedule 21.05.2018    source источник


Ответы (1)


Я думаю, поскольку ваши узлы id и ребра to и from являются числовыми, предполагается, что должны быть узлы для каждого целого числа между min(node$id) (2) и max(node$id) (512). Вы можете обойти это, принуждая их к символам. Кроме того, ваша команда iterpc у меня не работает должным образом, поэтому я преобразовал ее в версию tidyr расширения ваших данных.

node <- 
  df %>% 
  distinct(author_id, vendor) %>% 
  rename(id = author_id) %>% 
  mutate(vendor = as.numeric(vendor)) %>% 
  mutate(id = as.character(id))

edge <- 
  df %>% 
  group_by(topic_id) %>% 
  expand(topic_id, from = author_id, to = author_id) %>% 
  filter(from < to) %>% 
  select(to, from, topic_id) %>% 
  mutate_at(vars(to, from), as.character)

tidy_net <- tbl_graph(nodes = node, edges = edge, directed = F)
plot(tidy_net)
person CJ Yetman    schedule 22.05.2018
comment
Этот фильтр (от ‹ до) — ловкий трюк для извлечения уникальных комбинаций! Спасибо. - person aterhorst; 23.05.2018