我正在尝试根据系统发育树中的尖端标签来排序数据帧的行.我要这样做的方法是使用match类似于这个问题的答案的函数,但是我被卡住了因为如果你使用函数重新排序节点tip.label,apephylo对象的属性不会改变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"
Run Code Online (Sandbox Code Playgroud)
请注意,tip.label即使树的可视化表示没有改变,它的顺序也没有改变.在这个简单的例子中,ladderize函数之后树的视觉顺序是E A B C D(在绘图后从树的底部到顶部读取).如何获取tip.label向量的副本,其中顺序反映树中节点的新顺序?
cts*_*cts 11
看来关键是看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()
Run Code Online (Sandbox Code Playgroud)
第一步是从边缘矩阵的第二列过滤掉内部节点:
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
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用此向量以正确的顺序提取提示:
tree2$tip.label[ordered_tips]
#> [1] "E" "A" "B" "C" "D"
Run Code Online (Sandbox Code Playgroud)