用单独的 df 重命名 phylo tip 标签

Rename phylo tip labels with separate df

我希望使用第二个 df 重命名我的进化树中的 1290 个尖端标签。我可以使用以下代码一次重命名一个标签:

phylo$tip.label[phylo$tip.label=="e54924083c02bd088c69537d02406eb8"] <- "something"

但这显然效率低下。如何使用包含原始提示标签和新标签的第二个 df 重命名所有标签?需要的话我可以提供示例数据(文件很大)

谢谢!

您可以使用值匹配函数%in%首先检测哪些标签在数据框中的“旧标签”列中,然后用“新标签”替换它们。

## A random tree
my_tree <- rtree(20)

## A data.frame of names to replace
my_data_frame <- data.frame(old.labels = c("t1", "t3", "t9"),
                            new.labels = c("tip_1", "tip_3", "tip_9"))

## Find the old labels in the tree
my_tree$tip.label[my_tree$tip.label %in% my_data_frame$old.labels] <- my_data_frame$new.labels

my_tree$tip.label %in% my_data_frame$old.labels returns 每个提示的逻辑向量 (TRUE/FALSE) 匹配 my_data_frame$old.labels 然后你可以很容易地用一些东西替换您选择的相同长度(即 length(which(my_tree$tip.label %in% my_data_frame$old.labels)) == length(my_data_frame$new.labels))。

让我们举一个例子树:

oldTree <- ape::read.tree(text = "(t6, (t5, (t4, (t3, (t2, t1)))));")
old <- c("t1", "t3", "t6")
new <- c("tip_1", "tip_3", "tip_6")
plot(oldTree)

一个稳健的方法是:

tree <- oldTree
tree$tip.label[match(old, tree$tip.label)] <- new
plot(tree)

Thomas 的代码只有在 tree$tip.labelold.labels 中的标签顺序相同时才有效。

tree <- oldTree
my_data_frame <- data.frame(old.labels = old,
                            new.labels = new)

## Find the old labels in the tree
tree$tip.label[tree$tip.label %in% my_data_frame$old.labels] <- my_data_frame$new.labels

plot(tree)

在这里,提示的标签有误: