循环或矢量化此函数用于系统发育树枝降落

时间:2015-08-10 16:54:54

标签: r phylogeny ape-phylo

我有一个过程,我想重复已知的次数,但有一个问题。第一次迭代应该是原始数据集,然后下一个应该是第一次的结果,下一次应该是第二次的结果,......

某些背景:数据集的类型为phylo,因此append循环中的for函数对我没有意义。以下是实际代码:

library(ape)
library(geiger)

clade.dropper <- function(phy, drop.tips) {
new.phy <- drop.tip(phy, tips(phy, drop.tips[1]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[2]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[3]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[4]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[5]))
new.phy
}

我希望能够阻止上述的硬编码,并以某种方式将其循环到包含系统发育树的提示名称的给定列表中。

谢谢!

2 个答案:

答案 0 :(得分:3)

您的方法存在一些问题 - 每次对子树进行子集时都会重新绘制树节点 - 如果按节点编号进行子集化,则每次删除节点时,在下一个修剪时,下一个节点可能不是一个你想要的(我之前犯过这个痛苦的错误)。

如果按名称进行子集化,则可能没问题,但大多数树都没有节点名称。

我们可以做的是列出您想要一次删除的每个提示,然后立即修剪。

使用geigerape

library(geiger)
library(ape)

首先加载树:

geo <- get(data(geospiza))

提示功能未正确矢量化,让我们解决:

vtips <- Vectorize(tips, "node") 

现在我们可以立即放弃它们:

todrop <- c(18,20)
drop.tip(geo$phy, unlist(vtips(geo$phy, todrop)))

对于你的例子:

drop.tip(phy, unlist(vtips(phy, cladenum)))

答案 1 :(得分:0)

好吧,我并不完全熟悉所有这些系统发育的东西,但我相信Reduce()是你正在寻找的东西。演示简单的矢量示例:

A <- c(1,2,3,4,5);
Reduce(function(current,operand) current+operand,rep(1,6),A);
## [1]  7  8  9 10 11

以下是关于系统发育数据的工作原理,从帮助页面?phylo.clades上的示例代码中窃取:

library(ape);
library(geiger);
sal <- get(data(caudata));
tax <- cbind(sal$tax[,c('subfamily','family','suborder')],order='Caudata');
tphy <- phylo.lookup(tax,ncores=2);
clade.num <- 1:5;
Reduce(function(phy,clade.num) drop.tip(phy,tips(phy,clade.num)),clade.num,tphy);
##
## Phylogenetic tree with 613 tips and 19 internal nodes.
##
## Tip labels:
##   Batrachoseps_attenuatus, Batrachoseps_diabolicus, Batrachoseps_gavilanensis, Batrachoseps_incognitus, Batrachoseps_luciae, Batrachoseps_major, ...
## Node labels:
##   Caudata, Salamandroidea, Plethodontidae, Bolitoglossinae, Plethodontinae, Spelerpinae, ...
##
## Unrooted; no branch lengths.