मेरे पास शीर्ष स्तर से शुरू होने वाली शाखाओं के विभिन्न स्तरों वाला डेटासेट है: स्टॉक -> mbranch -> sbranch -> lsbranch। मैं अपने डेटा के इन स्तरों को न्यूिक प्रारूप में देखने में सक्षम होना चाहता हूं। मेरे पास प्रत्येक स्टॉक स्तर के भीतर अलग-अलग भाषा समूह हैं और इन उच्चतम स्तर के समूहों के आधार पर अलग-अलग पेड़ बनाना चाहते हैं।

उदाहरण के लिए मेरा डेटा निम्नानुसार प्रारूप में है:

sample= data.frame("stock" = c("A", "A", "B", "B", "B"), "mbranch" = c("C", "D", "E", "F", "G"), "sbranch" = c("H", "O", NA, "K", "L"), "lsbranch" = c("I", "J", NA, "M", "N"), "name" = c("Andrea", "Kevin", "Charlie", "Naomi", "Sam"))

और मैं नए पेड़ प्रारूप का आउटपुट प्राप्त करने का प्रयास कर रहा हूं जो कुछ ऐसा होगा:

tree = "(A(C(H(I(Andrew))),D(O(J(Kevin)))),B(E(Charlie),F(K(M(Naomi))),G(L(N(Sam)))));"
plot(read.dendrogram(tree))

मैं इसे बाद में कर रहा हूं, मैं अपने आउटपुट पेड़ के नोड्स की दूरी मैट्रिक्स कर सकता हूं।

क्या फ़ंक्शन write.tree इस तरह के डेटा का विश्लेषण करने और इससे एक पेड़ बनाने में सक्षम होगा (यह मानते हुए कि मेरा वास्तविक डेटासेट बहुत बड़ा है)? या सामान्य तौर पर, एक फ़ंक्शन जो ट्री प्रारूप को आउटपुट करेगा। धन्यवाद

1
Angie 27 जुलाई 2020, 21:40

1 उत्तर

सबसे बढ़िया उत्तर

आप अपने नए प्रारूप ट्री को पढ़ने के लिए ape::read.tree() फ़ंक्शन का उपयोग कर सकते हैं

tree = "(A(C(H(I(Andrew))),D(O(J(Kevin)))),B(E(Charlie),F(K(M(Naomi))),G(L(N(Sam)))));"
my_tree <- read.tree(text = tree)
plot(my_tree)

फिर आप ape::write.tree पेड़ को एक नई फ़ाइल में सहेजने के लिए उपयोग कर सकते हैं:

write.tree(my_tree, file = "my_file_name.tre")

अपनी तालिका को ape से "phylo" ऑब्जेक्ट में बदलने के लिए आप इस फ़ंक्शन का उपयोग कर सकते हैं (जिसमें कुछ समायोजन की आवश्यकता हो सकती है):

## The function
data.frame.to.phylo <- function(sample){
    ## Making an edge table
    edge_table <- rbind(
        ## The root connecting A to B
        rbind(c("root", "A"),c("root", "B")),
        ## All the nodes connecting to the tips
        cbind(sample$stock, sample$name)
        )

    ## Translating the values in the edge table into edge IDs
    ## The order must be tips, root, nodes
    element_names <- c(unique(sample$name), "root", unique(sample$stock))
    element_ids   <- seq(1:length(element_names))

    ## Looping through each ID and name
    for(element in element_ids) {
        edge_table <- ifelse(edge_table == element_names[element], element_ids[element], edge_table)
    }

    ## Make numeric
    edge_table <- apply(edge_table, 2, as.numeric)

    ## Build the phylo object
    phylo_object <- list()
    phylo_object$edge <- edge_table
    phylo_object$tip.label <- unique(sample$name)
    phylo_object$node.label <- c("root", unique(sample$stock))
    phylo_object$Nnode <- length(phylo_object$node.label)

    ## Forcing the class to be "phylo"
    class(phylo_object) <- "phylo"
    return(phylo_object)
}

## The data
sample = data.frame("stock" = c("A", "A", "B", "B", "B"), "mbranch" = c("C", "D", "E", "F", "G"), "sbranch" = c("H", "O", NA, "K", "L"), "lsbranch" = c("I", "J", NA, "M", "N"), "name" = c("Andrea", "Kevin", "Charlie", "Naomi", "Sam"))

## Plotting the data.frame for testing the function
plot(data.frame.to.phylo(sample))

चीयर्स, थॉमस

0
Dharman 28 जुलाई 2020, 15:17