0

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

一些背景:数据集是 type 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
}

我希望能够防止上述的硬编码,并以某种方式循环它以获取包含系统发育树的提示名称的给定列表以删除。

谢谢!

4

2 回答 2

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)))
于 2015-08-10T17:33:54.790 回答
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.
于 2015-08-10T17:20:33.877 回答