我正在尝试根据系统发育树中的尖端标签来排序数据帧的行.我要这样做的方法是使用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
向量的副本,其中顺序反映树中节点的新顺序?
看来关键是看edge
房产.提示始终是第一个给出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"