【问题标题】:How to use as_tbl_graph() with group_by()?如何将 as_tbl_graph() 与 group_by() 一起使用?
【发布时间】:2018-06-13 05:28:51
【问题描述】:

这是我最近遇到的issue on calculating graph depth 的后续问题。这涉及到 tidyverse 和 tidygraph。在阅读了 tidygraph 之后,我觉得我应该尝试一下,但我在工作流程中遇到了一个新问题。

当使用来自 dplyrgroup_by() 动词为每个组创建图表时,来自 tidygraphas_tbl_graph() 中的 guess_df_type() 函数并不像我想的那样'正在寻找,但我找不到按预期设置 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 列未知

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

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

【问题讨论】:

    标签: r dplyr tidygraph


    【解决方案1】:

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

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

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

    【讨论】:

    • 关于第一部分:数据是文本数据的模型,tokenhead都表示消息(@987654326)中句子(id_sub)中token之间的关系@) 作为依赖树。
    • 那么它是一种链表吗?
    • 您可能可以像链接列表一样处理它,但我不确定这是否有助于理解它。 Here 是 NLP 中依赖树的一个更好的例子。在我的例子中,所有令牌都至少在一个边上指向根令牌。
    • 没有内置支持此图形表示。如果您将单个 data.frame 传递给as_tbl_graph,它将期望它是一个边缘列表,但您的是一个节点列表,其父/子记录为变量。我建议您将边缘信息提取到单独的数据框中,然后执行tbl_graph(nodes, edges)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2021-08-28
    • 2016-10-17
    • 2018-04-03
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多