R phylo 对象:如何连接节点标签和节点号 [英] R phylo object: how to connect node label and node number
问题描述
R 中的 phylo 对象可以有内部节点标签(phylo_obj$node.label
),但许多 R 函数使用节点编号而不是节点标签.甚至 phylo 对象本身也使用节点编号来描述边 (phylo_obj$edge
),并且似乎没有将内部节点标签直接映射到用于 phylo_obj$edge<的这些节点编号/代码>.如何将节点标签(例如,NodeA"或Artiodactyla")映射到节点编号(例如,250 或 212)?我找不到任何 R 函数或通常有关此的任何文档.
A phylo object in R can have internal node labels (phylo_obj$node.label
), but many R functions use node numbers instead of the node labels. Even the phylo object itself uses node numbers to describe the edges (phylo_obj$edge
) and does not seem to have a direct mapping of internal node labels to these node numbers used for phylo_obj$edge
. How do I map node labels (eg., "NodeA" or "Artiodactyla") to the node number (eg., 250 or 212)? I can't find any R functions or generally any docs on this.
推荐答案
不完全确定这里的目标是什么,但是如果您想选择边表中的特定节点编号并且在节点标签向量中有等效项,您可以简单地使用 tree$node.label[node_number - Ntip(tree)]
.
Not exactly sure what is the objective here but if you want to select specific node numbers in the edge table and there equivalent in the node labels vector, you can simply use 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
mrca_node
现在是边缘表中节点的 ID(在本例中为大于 10 的数字).要选择等效的节点标签,您可以简单地从 mrca_node
中选择提示的数量:
mrca_node
is now the ID of the node in the edge table (in this case a number higher than 10). To select the equivalent node label you can simply select the number of tips from the mrca_node
:
## The node label for the mrca_node
my_tree$node.label[mrca_node-Ntip(my_tree)]
#[1] "node6"
或者,您可以从边缘表中选择您的节点标签
Alternatively, you can select your node labels from the edge table
## Method 2: directly extracting the nodes from the edge tables
node_labels_in_edge <- my_tree$node.label[my_tree$edge[,1]-Ntip(my_tree)]
tips_nodes <- my_tree$edge[,2]
select.tip.or.node <- function(element, tree) {
ifelse(element < Ntip(tree)+1, tree$tip.label[element], tree$node.label[element-Ntip(tree)])
}
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
这篇关于R phylo 对象:如何连接节点标签和节点号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!