0

我正在尝试识别由系统发育树中的节点对分隔的边数。例如,假设内部分支1由节点2223绑定。当然,这可以用nodelabels()and直观地完成edgelabels(),但我正在处理具有数千个技巧的系统发育,因此需要一种自动化的方式。

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

4

1 回答 1

0

您可以将存储在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+),因为所有边缘属性都是自动的。

于 2019-05-08T00:56:32.550 回答