How to get correct order of tip labels in APE after calling ladderize function

孤街浪徒 提交于 2019-11-30 16:57:01

问题


I'm trying to order the rows of a dataframe based on the tip labels found in a phylogenetic tree. The way I was going to do this was to use the match function similar to the answer from this question, however I'm stuck cause the tip.label property of the ape phylo object doesn't change if you reorder the nodes using the ladderize function.

library(ape)
tree <- read.tree(text = "(((A,B),(C,D)),E);")
tree2 <- ladderize(tree, right = FALSE)
tree$tip.label
#> [1] "A" "B" "C" "D" "E"
tree2$tip.label
#> [1] "A" "B" "C" "D" "E"

Notice that the order of the tip.label hasn't changed even though the visual representation of the tree does. In this simple example the visual order of the tree after the ladderize function is E A B C D (reading from bottom to top on the tree after plotting). How can I get a copy of the tip.label vector where the order reflects the new order of the nodes in the tree?


回答1:


It seems the key is to look at the edge property. The tips are always the first nodes to be given an ID, which will simply correspond to the position in the tip.label vector.

library(ape)
tree <- read.tree(text = "(((A,B),(C,D)),E);")
tree2 <- ladderize(tree, right = FALSE)
tree$tip.label
#> [1] "A" "B" "C" "D" "E"
tree2$tip.label
#> [1] "A" "B" "C" "D" "E"
plot(tree2)
nodelabels()
tiplabels()

First step is to filter out internal nodes from the the second column of the edge matrix:

is_tip <- tree2$edge[,2] <= length(tree2$tip.label)
#> [1]  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE

ordered_tips <- tree2$edge[is_tip, 2]
#> [1] 5 1 2 3 4

Then you can use this vector to extract the tips in the right order:

tree2$tip.label[ordered_tips]
#> [1] "E" "A" "B" "C" "D"


来源:https://stackoverflow.com/questions/34364660/how-to-get-correct-order-of-tip-labels-in-ape-after-calling-ladderize-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!