我试图根据系统发育树中的尖端标签来排序数据帧的行。我要这样做的方法是使用与this question的答案类似的match
函数,但是我被卡住会导致tip.label
ape
属性如果使用ladderize
函数重新排序节点,则phylo对象不会更改。
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
向量的副本,其中顺序反映了树中节点的新顺序?
答案 0 :(得分:10)
关键是看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"
答案 1 :(得分:0)
对于不同的包(ggtree),但我引用相同的问题:“要获取ggtree图的提示顺序,请执行以下操作:data(bird.orders) p <- ggtree::ggtree(bird.orders) p[["data"]]
#提取'label'和'y'列
来自此网站,并包装...尽管更换灯泡需要多少R包装? https://rdrr.io/github/joelnitta/jntools/man/get_tips_in_ape_plot_order.html