R phylo对象:如何连接节点标签和节点号 [英] R phylo object: how to connect node label and node number

查看:234
本文介绍了R phylo对象:如何连接节点标签和节点号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

R中的系统对象可以具有内部节点标签(phylo_obj$node.label),但是许多R函数使用节点号代替节点标签.即使是系统对象本身也使用节点号来描述边缘(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆