如何在group_by()中使用as_tbl_graph()?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在group_by()中使用as_tbl_graph()?相关的知识,希望对你有一定的参考价值。

这是我遇到的最近issue on calculating graph depth的后续问题。这涉及tidyverse和tidygraph。在读完整洁图后,我觉得我会试一试,但我的工作流程遇到了一个新问题。

当使用来自dplyr的group_by()动词为每个组创建一个图形时,来自tidygraph的guess_df_type()中的as_tbl_graph()函数不是我正在寻找的但是我找不到按照预期设置fromto值的方法。这是一个可重复的例子:

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_headid_sec

在进一步研究之后,我将tokenhead重命名为fromto,这至少解决了第一个问题:

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)

grouped_df_impl(data,unname(vars),drop)出错:

id_head未知

无论哪种方式,我都不明白如何使用tidygraph使用group_by。很感谢任何形式的帮助!提前致谢。

此外,抱歉使用igraph作为标签,它应该是整洁的,但这还不存在。 tidygraph建立在igraph和tidyverse tho之上。

答案

对于第一个问题,我有点不确定你的data.frame应该如何被解析成一个图形 - tidygraph包含它理解的所有图形表示的文档,我建议你参考这个。

对于第二个问题 - 只是节点处于活动状态而边缘包含您要分组的变量。只需在分组前激活边缘......

tmp %>% 
  rename(
    from = token,
    to = head
  ) %>%
  as_tbl_graph() %>%
  activate(edges) %>%
  group_by(id_head, id_sec)

以上是关于如何在group_by()中使用as_tbl_graph()?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R 和 dplyr 中连续的元素执行 group_by

当尝试在 group_by 和 mutate 中使用 get() 调用对象时,它会调出整个对象而不是分组对象。我该如何解决?

在 R 中使用 dplyr 在 group_by 之后应用自定义函数

如何在 R 中排除 group_by 中的值

如何通过 group_by 中的 group-number 对数据表进行编号/标记?

在 group_by 中使用列索引而不是名称