tidygraph 和 igraph - 从数据帧差异构建图形
tidygraph and igraph - build graph from dataframe discrepancy
我可以毫无问题地从两个数据帧在 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")))
接下来,我创建一个独特的节点列表(留言板上 post 事情的人):
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)
一切正常!到底是怎么回事?请帮忙。
我认为因为你的节点 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)
我可以毫无问题地从两个数据帧在 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")))
接下来,我创建一个独特的节点列表(留言板上 post 事情的人):
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)
一切正常!到底是怎么回事?请帮忙。
我认为因为你的节点 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)