我正在尝试根据系统树中的提示标签对数据框的行进行排序。我要做的方法是使用类似于this question的答案的match
函数,但是我被卡住了,因为如果使用tip.label
函数对节点重新排序,则ape
phylo对象的ladderize
属性不会更改。
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"
请注意,即使树的视觉表示发生了变化,
tip.label
的顺序也没有改变。在此简单示例中,ladderize
函数之后的树的视觉顺序为E A B C D
(绘制后从树的底部到顶部读取)。如何获得tip.label
向量的副本,其顺序反射(reflect)树中节点的新顺序? 最佳答案
看来关键是看edge
属性。提示始终是第一个被赋予ID的节点,该ID将仅与tip.label
向量中的位置相对应。
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()
第一步是从边缘矩阵的第二列中滤除内部节点:
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
然后,您可以使用此向量以正确的顺序提取提示:
tree2$tip.label[ordered_tips]
#> [1] "E" "A" "B" "C" "D"
关于r - 调用梯形函数后如何在APE中获得正确的提示标签顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34364660/