2017-08-23 3 views
1

私は属レベルで注釈をつけたツリーを持っています(つまり、各リーフに名前があります)。子供が同じ属を持つ限り、ブランチ/エッジの葉の色を伝えたいので、このプロットのように:tidygraphの子から値を伝播

enter image description here

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) 

enter image description here

あり、この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]] 
    })) 
マルコSandri答え

01後

Error in mutate_impl(.data, dots) : Evaluation error: Cannot coerce values to character(1).

EDIT

mutate(Genus = as.character(Genus))の場合、これ以上エラーメッセージは表示されませんが、属は正しく伝播しません。たとえば、右から3番目と4番目のノードが表示されます。親はNA ...となります(ブログポストプロットでは機能しません)。 TBL

enter image description here

答えて

2

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]] 
    })) 
+0

ありがとうございました。しかし、私の編集で言ったように、コードはうまく動作しません。 – AntoineBic

+0

@ MrSnakeこれは別の新しい質問です。今すぐコードが動作しますが、期待した結果が得られません。この投稿を閉じる(削除しない)ようにして、あなたの問題の詳細を記述する新しい場所を開くことをお勧めします。 –