我有一个过程,我想重复已知的次数,但有一个问题。第一次迭代应该是原始数据集,然后下一个应该是第一次的结果,下一次应该是第二次的结果,......
某些背景:数据集的类型为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
}
我希望能够阻止上述的硬编码,并以某种方式将其循环到包含系统发育树的提示名称的给定列表中。
谢谢!
答案 0 :(得分:3)
您的方法存在一些问题 - 每次对子树进行子集时都会重新绘制树节点 - 如果按节点编号进行子集化,则每次删除节点时,在下一个修剪时,下一个节点可能不是一个你想要的(我之前犯过这个痛苦的错误)。
如果按名称进行子集化,则可能没问题,但大多数树都没有节点名称。
我们可以做的是列出您想要一次删除的每个提示,然后立即修剪。
使用geiger
和ape
:
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.