2015-12-18 13 views
6

Sto tentando di ordinare le righe di un dataframe in base alle etichette tip trovate in un albero filogenetico. Il modo in cui avrei dovuto farlo era utilizzare la funzione match simile alla risposta da this question, tuttavia sono bloccato perché la proprietà tip.label dell'oggetto ape phylo non cambia se si riordinano i nodi utilizzando la funzione ladderize.Come ottenere l'ordine corretto delle etichette tip nell'APE dopo aver chiamato la funzione ladderize

library(ape) 
tree <- read.tree(text = "(((A,B),(C,D)),E);") 
tree2 <- ladderize(tree, right = FALSE) 
tree$tip.label 
#> [1] "A" "B" "C" "D" "E" 
tree2$tip.label 
#> [1] "A" "B" "C" "D" "E" 

Si noti che l'ordine del tip.label non è cambiata, anche se la rappresentazione visiva dell'albero fa. In questo semplice esempio l'ordine visivo dell'albero dopo la funzione ladderize è E A B C D (lettura dal basso verso l'alto sull'albero dopo la stampa). Come posso ottenere una copia del vettore tip.label in cui l'ordine riflette il nuovo ordine dei nodi nell'albero?

risposta

7

Sembra che la chiave sia guardare la proprietà edge. I suggerimenti sono sempre i primi nodi a ricevere un ID, che corrisponderà semplicemente alla posizione nel vettore tip.label.

library(ape) 
tree <- read.tree(text = "(((A,B),(C,D)),E);") 
tree2 <- ladderize(tree, right = FALSE) 
tree$tip.label 
#> [1] "A" "B" "C" "D" "E" 
tree2$tip.label 
#> [1] "A" "B" "C" "D" "E" 
plot(tree2) 
nodelabels() 
tiplabels() 

primo passo è quello di filtrare i nodi interni dalla seconda colonna della matrice bordo:

is_tip <- tree2$edge[,2] <= length(tree2$tip.label) 
#> [1] TRUE FALSE FALSE TRUE TRUE FALSE TRUE TRUE 

ordered_tips <- tree2$edge[is_tip, 2] 
#> [1] 5 1 2 3 4 

Quindi è possibile utilizzare questo vettore per estrarre le punte nel giusto ordine:

tree2$tip.label[ordered_tips] 
#> [1] "E" "A" "B" "C" "D" 
Problemi correlati