我正在尝试用类群名称替换系统发育树的尖端。我有一个 CSV 文件,第一列中包含尖端标签,第二列中包含分类单元名称。但是,树上提示标签的顺序与 CSV 的顺序不同。如何重新排列 CSV 文件以匹配提示标签的顺序,而无需手动执行?
正如预期的那样,这会用 CSV 中的数据替换旧树中的提示标签并将其写入新文件,但新提示标签的顺序错误:
library(ape)
library(phytools)
library(phylotools)
library(evobiR)
library(dplyr)
Tree <- ape::read.tree(file="/Users//AlkBtree.nwk")
List <- read.csv(file="/Users//AlkBStrNames.csv")
tips <- Tree$tip.label
df <- data.frame(List$Name)
dat <- data.frame(tips, df)
ntree <- phylotools::sub.taxa.label(Tree,dat)
ape::write.tree(ntree, file="/Users//AlkBtreeN.nwk")
我尝试使用 evobiR 包对列表进行重新排序,但它返回了此错误:
Reordered <- evobiR::ReorderData(Tree, List$Filename, taxa.names="row names")
Error in new.data[i] <- data[which(names(data) == tree$tip.label[i])] :
replacement has length zero
我还对同一命令进行了其他配置,并得到了不同但类似的错误:
> Reordered <- evobiR::ReorderData(Tree, List, taxa.names=2)
Error in x[[jj]][iseq] <- vjj : replacement has length zero
最后,我尝试了这个命令:
dats <- match(Tree$tip.label,List)
这导致了正确长度的列表,但所有值都是“NA”
尝试更换:
df <- data.frame(List$Name)
dat <- data.frame(tips, df)
与:
dat <- List[match(tips, List$Name),]
或者,使用
dplyr
:
dat <- left_join(data.frame(tips), List, by = c("tips" = "Name"))