2015-12-18 8 views
6

Ich versuche, die Zeilen eines Datenrahmens basierend auf den Tipp-Labels in einem phylogenetischen Baum zu sortieren. Die Art, wie ich das tun würde, war die match Funktion ähnlich der Antwort von this question, aber ich bin fest, weil die tip.label Eigenschaft des ape Phylo-Objekts nicht ändert, wenn Sie die Knoten mit der ladderize Funktion neu anordnen. So erhalten Sie die richtige Reihenfolge der Spitzenbeschriftungen in APE nach dem Aufruf der ladderize-Funktion

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" 

Beachten Sie, dass die Reihenfolge der tip.label nicht, obwohl die visuelle Darstellung des Baumes hat sich geändert hat. In diesem einfachen Beispiel ist die visuelle Reihenfolge des Baums nach der ladderize Funktion E A B C D (Lesen von unten nach oben auf dem Baum nach dem Plotten). Wie kann ich eine Kopie des Vektors tip.label erhalten, in der die Reihenfolge die neue Reihenfolge der Knoten im Baum widerspiegelt?

Antwort

7

Es scheint der Schlüssel ist, um die edge Eigenschaft zu betrachten. Die Spitzen sind immer die ersten Knoten, denen eine ID gegeben wird, die einfach der Position im Vektor tip.label entsprechen.

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() 

erster Schritt ist die internen Knoten aus der zweiten Spalte der Kantenmatrix filtern:

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 

Dann kann man diesen Vektor verwenden, um die Spitzen in der richtigen Reihenfolge zu extrahieren:

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