如何将 as_tbl_graph() 与 group_by() 一起使用?
How to use as_tbl_graph() with group_by()?
这是我最近 遇到的一个后续问题。这涉及到 tidyverse 和 tidygraph。在阅读了 tidygraph 之后,我觉得我应该好好尝试一下,但我在工作流程中遇到了一个新问题。
当使用 dplyr 中的 group_by()
动词为每个组创建图表时,as_tbl_graph()
中的 guess_df_type()
函数来自 tidygraph 不是我要找的东西,但我找不到一种方法来设置 from
和 to
值。这是一个可重现的例子:
library(tidygraph)
library(tidyverse)
tmp <- tibble(
id_head = as.integer(c(4,4,4,4,4,4,5,5,5,5)),
id_sec = as.integer(c(1,1,1,2,2,2,1,1,2,2)),
token = as.integer(c(1,2,3,1,2,3,1,2,1,2)),
head = as.integer(c(2,2,2,1,1,2,2,2,2,2)),
root = as.integer(c(2,2,2,1,1,1,2,2,2,2))
)
tmp %>%
group_by(id_head, id_sec) %>%
as_tbl_graph()
结果是:
# A tbl_graph: 4 nodes and 10 edges
#
# An undirected multigraph with 1 component
#
# Node Data: 4 x 1 (active)
name
<chr>
1 4
2 5
3 1
4 2
#
# Edge Data: 10 x 5
from to token head root
<int> <int> <dbl> <dbl> <dbl>
1 1 3 1 2 2
2 1 3 2 2 2
3 1 3 3 2 2
# ... with 7 more rows
节点不是取自令牌列,而是取自 id_head
和 id_sec
。
进一步研究后,我将 token
和 head
重命名为 from
和 to
,这至少解决了第一个问题:
tmp %>%
rename(
from = token,
to = head
) %>%
as_tbl_graph(directed = FALSE)
结果:
# A tbl_graph: 3 nodes and 10 edges
#
# An undirected multigraph with 1 component
#
# Node Data: 3 x 1 (active)
name
<chr>
1 1
2 2
3 3
#
# Edge Data: 10 x 5
from to id_head id_sec root
<int> <int> <int> <int> <int>
1 1 2 4 1 2
2 2 2 4 1 2
3 2 3 4 1 2
# ... with 7 more rows
让我进一步阐述我遇到的问题。当我尝试在图中使用 group_by(id_head,id_sec) 时,结果是错误的:
tmp %>%
as_tbl_graph() %>%
group_by(id_head, id_sec)
Error in grouped_df_impl(data, unname(vars), drop) :
Column id_head
is unknown
所以无论哪种方式,我都不明白如何将 group_by 与 tidygraph 一起使用。很感谢任何形式的帮助!提前致谢。
另外,很抱歉使用 igraph 作为标签,它应该是 tidygraph 但目前还不存在。 tidygraph 建立在 igraph 和 tidyverse 之上。
对于第一个问题,我有点不确定如何将您的 data.frame 解析为图表 - tidygraph 包含有关它理解的所有图表表示的文档,我建议您查阅此文件。
对于第二个问题 - 这只是节点处于活动状态而边缘包含您要分组的变量的问题。只需在分组之前激活边缘...
tmp %>%
rename(
from = token,
to = head
) %>%
as_tbl_graph() %>%
activate(edges) %>%
group_by(id_head, id_sec)
这是我最近
当使用 dplyr 中的 group_by()
动词为每个组创建图表时,as_tbl_graph()
中的 guess_df_type()
函数来自 tidygraph 不是我要找的东西,但我找不到一种方法来设置 from
和 to
值。这是一个可重现的例子:
library(tidygraph)
library(tidyverse)
tmp <- tibble(
id_head = as.integer(c(4,4,4,4,4,4,5,5,5,5)),
id_sec = as.integer(c(1,1,1,2,2,2,1,1,2,2)),
token = as.integer(c(1,2,3,1,2,3,1,2,1,2)),
head = as.integer(c(2,2,2,1,1,2,2,2,2,2)),
root = as.integer(c(2,2,2,1,1,1,2,2,2,2))
)
tmp %>%
group_by(id_head, id_sec) %>%
as_tbl_graph()
结果是:
# A tbl_graph: 4 nodes and 10 edges
#
# An undirected multigraph with 1 component
#
# Node Data: 4 x 1 (active)
name
<chr>
1 4
2 5
3 1
4 2
#
# Edge Data: 10 x 5
from to token head root
<int> <int> <dbl> <dbl> <dbl>
1 1 3 1 2 2
2 1 3 2 2 2
3 1 3 3 2 2
# ... with 7 more rows
节点不是取自令牌列,而是取自 id_head
和 id_sec
。
进一步研究后,我将 token
和 head
重命名为 from
和 to
,这至少解决了第一个问题:
tmp %>%
rename(
from = token,
to = head
) %>%
as_tbl_graph(directed = FALSE)
结果:
# A tbl_graph: 3 nodes and 10 edges
#
# An undirected multigraph with 1 component
#
# Node Data: 3 x 1 (active)
name
<chr>
1 1
2 2
3 3
#
# Edge Data: 10 x 5
from to id_head id_sec root
<int> <int> <int> <int> <int>
1 1 2 4 1 2
2 2 2 4 1 2
3 2 3 4 1 2
# ... with 7 more rows
让我进一步阐述我遇到的问题。当我尝试在图中使用 group_by(id_head,id_sec) 时,结果是错误的:
tmp %>%
as_tbl_graph() %>%
group_by(id_head, id_sec)
Error in grouped_df_impl(data, unname(vars), drop) :
Column
id_head
is unknown
所以无论哪种方式,我都不明白如何将 group_by 与 tidygraph 一起使用。很感谢任何形式的帮助!提前致谢。
另外,很抱歉使用 igraph 作为标签,它应该是 tidygraph 但目前还不存在。 tidygraph 建立在 igraph 和 tidyverse 之上。
对于第一个问题,我有点不确定如何将您的 data.frame 解析为图表 - tidygraph 包含有关它理解的所有图表表示的文档,我建议您查阅此文件。
对于第二个问题 - 这只是节点处于活动状态而边缘包含您要分组的变量的问题。只需在分组之前激活边缘...
tmp %>%
rename(
from = token,
to = head
) %>%
as_tbl_graph() %>%
activate(edges) %>%
group_by(id_head, id_sec)