我有一个数据集,其中为R中的另一列(称为索引列)的每个值列出了多个物种。我需要为每个列值提取或修剪系统发展史(从系统学中),然后计算索引列的每个值的系统发育距离。我的数据集中有许多索引值,因此手动执行此操作是不切实际的。
示例输入数据(2列,一列用于索引,一列用于物种):
Index Species
A ; Sp. 1
A ; Sp. 2
A ; Sp. 3
A ; Sp. 4
B ; Sp. 5
B ; Sp. 1
C ; Sp. 6
D ; Sp. 7
D ; Sp. 2
D ; Sp. 8
D ; Sp. 9我想要输出什么(虚构的值;每个索引出现一次,并计算所有相关物种的系统发育距离):
Index; phylogentic distance
A ; 7
B ; 3
C ; 1
D ; 5我已经使用brranching包从phylomatic下载了一棵全局树(针对数据集中的所有物种)。我可以设置一个循环或函数来修剪每个索引类别中物种的系统发育,并计算PD,或者我可以设置一个函数,为索引的每个值从系统中提取一棵新树,然后计算PD。如果有人已经做过类似的事情,或者有关于如何在R中实现这一点的想法,我将非常感激!
library(brranching)
phylomatic(data$Species)发布于 2019-11-11 18:43:45
我解决了这个问题。首先,我将Index列转换为numeric,然后运行以下循环。drop.tip()函数来自ape包。
IDs <- unique(d.test$index.num)
dd <- data.frame(matrix(nrow=length(IDs), ncol=2))
for (i in 1:length(IDs)) {
temp <- subset(d.test, d.test$index.num == i)
species <- as.vector(temp$Species)
species <- tolower(species)
pruned.tree <- drop.tip(tree, setdiff(tree$tip.label, species))
pd <- sum(pruned.tree$edge.length)
dd[i,1] <-i
dd[i,2] <- pd
}https://stackoverflow.com/questions/58754428
复制相似问题