2015-08-10 2 views
0

У меня есть процесс, который я хотел бы повторить известное количество раз, но с уловкой. Первая итерация должна быть с исходным набором данных, затем следующая должна быть с результатом первого, следующего с результатом второго, ...Loop или Vectorize this function for Phylogenetic Tree Clade Dropping

Некоторые фон: набор данных имеет тип 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

, если вы используете обезьяну, drop.tip уже делает это: new.phy <- drop.tip (PHY, clade.nums) – jeremycg

+0

Как правило, вы должны включать в себя строка 'library (your_package)' в вопросе и, возможно, тег для пакета (если он существует), чтобы люди могли узнать, о чем вы говорите. (Я не знаю никаких объектов 'phylo' или каких-либо функций' drop.tip'.) – Frank

+0

Кажется, что это не работает, поскольку drop.tip требует, чтобы метки меток отбрасывались. Я попытался использовать предоставленный вами код, и полученный объект phylo не изменился. Таким образом, я привел к функции tips(), чтобы получить метки меток для каждой заинтересованной клады. –

ответ

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))) 
+0

Я только что прочитал этот комментарий после того, как отредактировал свой вопрос. Вы абсолютно правы; имена узлов будут меняться при редактировании дерева; поэтому следует использовать имена наконечников. Я никогда не видел функцию «Vectorize». Это гарантия дня. Пригвоздил его! –

+0

никаких проблем - рад, что это работает – jeremycg

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. 
+0

Вы удаляете потомков node1 в первом дереве, node2 во втором дереве и т. Д.Поскольку узлы переопределены для каждой капли, если OP определены узлы его исходного дерева, то вы будете удалять неправильные. – jeremycg

+1

@jeremycg Я дал вам +1, потому что вы говорите так, как будто знаете, о чем говорите. :) – bgoldst

+0

спасибо, ваш ответ действительно решает вопрос OPs, но способ R обрабатывает деревья означает, что он не будет правильным ответом. – jeremycg