r语言 - 如何从系统发育中的节点路径识别边缘编号



我正在尝试识别由系统发育树中的节点对分隔的边缘数字。例如,假设内部分支 1 受节点 2223 的约束。当然,这可以通过nodelabels()edgelabels()直观地完成,但我正在使用具有数千个提示的系统发育,因此需要一种自动化的方式。

是否有任何命令可以将节点号与边缘号匹配?

您可以使用存储在 phylo 对象中的边缘表作为$edge

## A random tree
tree <- rtree(5)
tree$edge
#     [,1] [,2]
#[1,]    6    7
#[2,]    7    1
#[3,]    7    2
#[4,]    6    8
#[5,]    8    3
#[6,]    8    9
#[7,]    9    4
#[8,]    9    5

读取这些表的方法是:行号是边缘号(你所追求的(,第一列是父节点,第二列是子提示/节点:

## The edge table
edge_table <- tree$edge
rownames(edge_table) <- paste("edge", 1:nrow(edge_table), sep = ""))
colnames(edge_table) <- c("parent", "child")
edge_table
#      parent child
#edge1      6     7
#edge2      7     1
#edge3      7     2
#edge4      6     8
#edge5      8     3
#edge6      8     9
#edge7      9     4
#edge8      9     5

节点/提示 1 到 5 (Ntip(tree) ( 是提示,然后,6 是第一个节点(例如根(最多 Ntip(tree) + Nnode(tree) 个。

要基于节点选择任何边,可以运行以下命令:

## Getting the nodes of interest
nodes_of_interest <- c(6, 7, 8)
## Getting the edges connecting to the nodes
edge_parent <- rownames(edge_table)[edge_table[,1] %in% nodes_of_interest]
edge_child  <- rownames(edge_table)[edge_table[,2] %in% nodes_of_interest]

这当然可以推广到任何树大小(例如 8000+(,因为所有边缘归因都是自动的。

最新更新