R phylo对象:如何连接节点标签和节点编号

sha*_*aea 5 tree r nodes ape phylogeny

R 中的 phylo 对象可以具有内部节点标签 ( phylo_obj$node.label),但许多 R 函数使用节点编号而不是节点标签。甚至 phylo 对象本身也使用节点号来描述边(phylo_obj$edge),并且似乎没有内部节点标签到这些用于的节点号的直接映射phylo_obj$edge。如何将节点标签(例如,“NodeA”或“Artiodactyla”)映射到节点编号(例如,250 或 212)?我找不到任何 R 函数,也找不到任何相关文档。

Tho*_*rme 6

不完全确定这里的目标是什么,但如果您想在边缘表中选择特定的节点号以及节点标签向量中的等效节点号,您可以简单地使用tree$node.label[node_number - Ntip(tree)]

更详细地说:

## Simulating a random tree
set.seed(1)
my_tree <- rtree(10)
my_tree$node.label <- paste0("node", seq(1:9))
## Method 1: selecting a node of interest (e.g. MRCA)
mrca_node <- getMRCA(my_tree, tip = c("t1", "t2"))
#[1] 16
Run Code Online (Sandbox Code Playgroud)

mrca_node现在是边缘表中节点的 ID(在本例中是大于 10 的数字)。要选择等效的节点标签,您只需从以下位置选择提示数mrca_node

## The node label for the mrca_node
my_tree$node.label[mrca_node-Ntip(my_tree)]
#[1] "node6"
Run Code Online (Sandbox Code Playgroud)

或者,您可以从边缘表中选择节点标签

## Method 2: directly extracting the nodes from the edge tables
# Function selecting the tip or node name corresponding to the edge row
select.tip.or.node <- function(element, tree) {
    ifelse(element < Ntip(tree)+1,
           tree$tip.label[element],
           tree$node.label[element-Ntip(tree)])
}

## Making the edge table
edge_table <- data.frame(
                "parent" = my_tree$edge[,1],
                "par.name" = sapply(my_tree$edge[,1],
                                    select.tip.or.node,
                                    tree = my_tree),
                "child" = my_tree$edge[,2],
                "chi.name" = sapply(my_tree$edge[,2],
                                    select.tip.or.node,
                                    tree = my_tree)
                )
#   parent par.name child chi.name
#1      11    node1    12    node2
#2      12    node2     1      t10
#3      12    node2    13    node3
#4      13    node3     2       t6
#5      13    node3     3       t9
#6      11    node1    14    node4
#7      14    node4    15    node5
#8      15    node5    16    node6
#9      16    node6     4       t1
#10     16    node6    17    node7
#11     17    node7     5       t2
#12     17    node7     6       t7
#13     15    node5     7       t3
#14     14    node4    18    node8
#15     18    node8    19    node9
#16     19    node9     8       t8
#17     19    node9     9       t4
#18     18    node8    10       t5
Run Code Online (Sandbox Code Playgroud)

  • 多年后回顾,我仍然不明白为什么 `ape::phylo` 对象对于 `phylo$edge` 矩阵如何匹配 `phylo$tip.label` 没有更清楚。似乎只需要对代码进行很小的更改即可将行名称添加到至少包含提示标签的“phylo$edge”矩阵中。 (2认同)