【问题标题】:Propagate value from children with tidygraph用 tidygraph 从孩子那里传播价值
【发布时间】:2017-08-23 13:11:10
【问题描述】:

我有一棵在属级别注释的树(即每片叶子都有一个名称),只要孩子们具有相同的属,我想传播分支/边缘中叶子的颜色,就像在这个情节中一样:

Source

我的树是here(抱歉,dput 不起作用……)他看起来像这样:

library(ggraph)
library(tidygraph)
load("tree_v3")

TBL %>% activate(nodes) %>% as_tibble
# A tibble: 50 x 2
    leaf      Genus
   <lgl>     <fctr>
 1 FALSE         NA
 2  TRUE Klebsiella
 3  TRUE Klebsiella
 4 FALSE         NA
 5  TRUE Klebsiella
 6  TRUE Klebsiella
 7 FALSE         NA
 8 FALSE         NA
 9  TRUE Klebsiella
10 FALSE         NA
# ... with 40 more rows

我可以使用此代码打印树,但如您所见,边缘颜色停留在叶子附近。

TBL %>%
  ggraph('dendrogram') + 
  theme_bw() +
  geom_edge_diagonal2(aes(color = node.Genus)) +
  scale_edge_color_discrete(guide = FALSE) +
  geom_node_point(aes(filter = leaf, color = Genus), size = 2)

blog post映射搜索 部分中有一个代码,但它不适用于我的数据,我不明白为什么......

TBL2 <- TBL %>%
  activate(nodes) %>%
  mutate(Genus = map_bfs_back_chr(node_is_root(), .f = function(node, path, ...) {
    nodes <- .N()
    if (nodes$leaf[node]) return(nodes$Genus[node])
    if (anyNA(unlist(path$result))) return(NA_character_)
    path$result[[1]]
  }))

mutate_impl(.data, dots) 中的错误:评估错误:无法强制 值到字符(1)。

在 Marco Sandri 回答后编辑

mutate(Genus = as.character(Genus)) 没有更多错误消息,但 Genus 无法正确传播。例如从右边开始看第三个和第四个节点:父节点应该是NA...(请注意,它在博客文章情节中也不起作用)。

【问题讨论】:

    标签: r tidyverse dendrogram ggraph tidygraph


    【解决方案1】:

    TBL 中的Genus 是一个因素:

    str(TBL %>% activate(nodes) %>% as_tibble)
    
    # Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       50 obs. of  2 variables:
    # $ leaf : logi  FALSE TRUE TRUE FALSE TRUE TRUE ...
    # $ Genus: Factor w/ 10 levels "","Citrobacter",..: NA 6 6 NA 6 6 NA NA 6 NA ...
    

    但应该是一个字符。
    Genus 从因子转换为字符后,代码就可以工作了。

    TBL2 <- TBL %>%
      activate(nodes) %>% 
      mutate(Genus = as.character(Genus)) %>%
        mutate(Species = map_bfs_back_chr(node_is_root(), .f = function(node, path, ...) {
            nodes <- .N()
            if (nodes$leaf[node]) return(nodes$Genus[node])
            if (anyNA(unlist(path$result))) return(NA_character_)
            path$result[[1]]
        }))
    

    【讨论】:

    • 感谢您的帮助。但是,正如我在编辑中所说的那样,代码不能很好地工作。
    • @MrSnake 这是一个不同的新问题。现在代码可以工作了,但它没有给你预期的结果。我建议您关闭(而不是删除)此帖子并打开一个新帖子,详细描述您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2015-07-18
    相关资源
    最近更新 更多