如何根据模板列表重新排列包含分类数据的 CSV 文件

问题描述 投票:0回答:1

我正在尝试用类群名称替换系统发育树的尖端。我有一个 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”

r csv bioinformatics phylogeny ape-phylo
1个回答
0
投票

尝试更换:

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"))
© www.soinside.com 2019 - 2024. All rights reserved.