## as.phylo.formula.R (2005-12-10)
## Conversion from Taxonomy Variables to Phylogenetic Trees
## Copyright 2005 Julien Dutheil
## This file is part of the R-package `ape'.
## See the file ../COPYING for licensing issues.
as.phylo.formula <- function(x, data=parent.frame(), ...)
{
# Testing formula syntax:
err <- "Formula must be of the kind \"~A1/A2/.../An\"."
if(length(x) != 2) stop(err)
if(x[[1]] != "~") stop(err)
f <- x[[2]]
taxo <- list()
while(length(f) == 3) {
if(f[[1]] != "/") stop(err)
if(!is.factor(data[[deparse(f[[3]])]])) stop(paste("Variable", deparse(f[[3]]), "must be a factor."))
taxo[[deparse(f[[3]])]] <- data[[deparse(f[[3]])]]
if(length(f) > 1) f <- f[[2]]
}
if(!is.factor(data[[deparse(f)]])) stop(paste("Variable", deparse(f), "must be a factor."))
taxo[[deparse(f)]] <- data[[deparse(f)]]
taxo.data <- as.data.frame(taxo)
leaves.names <- as.character(taxo.data[,1])
taxo.data[,1] <- 1:nrow(taxo.data)
# Now builds the phylogeny:
f.rec <- function(subtaxo) { # Recurrent utility function
u <- ncol(subtaxo)
levels <- unique(subtaxo[,u])
if(u == 1) {
if(length(levels) != nrow(subtaxo))
warning("Error, leaves names are not unique.")
return(as.character(subtaxo[,1]))
}
t <- character(length(levels))
for(l in 1:length(levels)) {
x <- f.rec(subtaxo[subtaxo[,u] == levels[l],][1:(u-1)])
if(length(x) == 1) t[l] <- x
else t[l] <- paste("(", paste(x, collapse=","), ")", sep="")
}
return(t)
}
string <- paste("(", paste(f.rec(taxo.data), collapse=","), ");", sep="")
phy<-read.tree(text=string)
phy$tip.label <- leaves.names[as.numeric(phy$tip.label)]
return(phy)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.