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 函数或一般的任何文档。
不完全确定这里的 objective 是什么,但是如果您想 select 边缘 table 中的特定节点编号以及节点标签向量中的等效项,您可以简单地使用 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 table(在本例中是一个大于 10 的数字)。要 select 等效节点标签,您可以简单地 select 来自 mrca_node
:
的提示数
## The node label for the mrca_node
my_tree$node.label[mrca_node-Ntip(my_tree)]
#[1] "node6"
或者,您可以 select 来自边缘的节点标签 table
## 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
R 中的 phylo 对象可以具有内部节点标签 (phylo_obj$node.label
),但许多 R 函数使用节点编号而不是节点标签。甚至 phylo 对象本身也使用节点号来描述边缘 (phylo_obj$edge
),并且似乎没有将内部节点标签直接映射到用于 phylo_obj$edge
的这些节点号。如何将节点标签(例如 "NodeA" 或 "Artiodactyla")映射到节点编号(例如 250 或 212)?我找不到任何 R 函数或一般的任何文档。
不完全确定这里的 objective 是什么,但是如果您想 select 边缘 table 中的特定节点编号以及节点标签向量中的等效项,您可以简单地使用 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 table(在本例中是一个大于 10 的数字)。要 select 等效节点标签,您可以简单地 select 来自 mrca_node
:
## The node label for the mrca_node
my_tree$node.label[mrca_node-Ntip(my_tree)]
#[1] "node6"
或者,您可以 select 来自边缘的节点标签 table
## 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