2015-12-18 15 views
6

Tôi đang cố gắng sắp xếp các hàng của một khung dữ liệu dựa trên các nhãn đầu được tìm thấy trong cây phát sinh loài. Cách tôi sẽ làm điều này là sử dụng hàm match tương tự như câu trả lời từ this question, tuy nhiên tôi bị kẹt gây ra thuộc tính tip.label của đối tượng phylo ape không thay đổi nếu bạn sắp xếp lại các nút bằng chức năng ladderize.Cách nhận đúng thứ tự các nhãn đầu trong APE sau khi gọi hàm 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" 

Lưu ý rằng thứ tự của tip.label không thay đổi mặc dù biểu thị trực quan của cây. Trong ví dụ đơn giản này, thứ tự hình ảnh của cây sau hàm ladderizeE A B C D (đọc từ dưới lên trên trên cây sau khi vẽ). Làm thế nào tôi có thể nhận được một bản sao của vector tip.label trong đó thứ tự phản ánh thứ tự mới của các nút trong cây?

Trả lời

7

Có vẻ như điều quan trọng là xem xét thuộc tính edge. Các mẹo luôn là các nút đầu tiên được cấp một ID, chỉ đơn giản là sẽ tương ứng với vị trí trong vector 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() 

Bước đầu tiên là để lọc ra các nút nội bộ từ cột thứ hai của ma trận cạnh:

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 

Sau đó, bạn có thể sử dụng vector này để trích những lời khuyên theo thứ tự đúng:

tree2$tip.label[ordered_tips] 
#> [1] "E" "A" "B" "C" "D" 
Các vấn đề liên quan