首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于获取和/或操作R中关于另一个变量的多个值的系统发生图的循环

用于获取和/或操作R中关于另一个变量的多个值的系统发生图的循环
EN

Stack Overflow用户
提问于 2019-11-08 01:49:14
回答 1查看 32关注 0票数 0

我有一个数据集,其中为R中的另一列(称为索引列)的每个值列出了多个物种。我需要为每个列值提取或修剪系统发展史(从系统学中),然后计算索引列的每个值的系统发育距离。我的数据集中有许多索引值,因此手动执行此操作是不切实际的。

示例输入数据(2列,一列用于索引,一列用于物种):

代码语言:javascript
复制
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

我想要输出什么(虚构的值;每个索引出现一次,并计算所有相关物种的系统发育距离):

代码语言:javascript
复制
Index;      phylogentic distance
A ;         7
B ;         3
C ;         1
D ;         5

我已经使用brranching包从phylomatic下载了一棵全局树(针对数据集中的所有物种)。我可以设置一个循环或函数来修剪每个索引类别中物种的系统发育,并计算PD,或者我可以设置一个函数,为索引的每个值从系统中提取一棵新树,然后计算PD。如果有人已经做过类似的事情,或者有关于如何在R中实现这一点的想法,我将非常感激!

代码语言:javascript
复制
library(brranching)

phylomatic(data$Species)
EN

回答 1

Stack Overflow用户

发布于 2019-11-11 18:43:45

我解决了这个问题。首先,我将Index列转换为numeric,然后运行以下循环。drop.tip()函数来自ape包。

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58754428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档