## collapse.singles.R (2013-01-16) ## Collapse "Single" Nodes ## Copyright 2006 Ben Bolker, 2013 Klaus Schliep ## This file is part of the R-package `ape'. ## See the file ../COPYING for licensing issues. collapse.singles <- function(tree) { tree <- reorder(tree) # added by Klaus elen <- tree$edge.length xmat <- tree$edge ## added by Elizabeth Purdom (2008-06-19): node.lab <- tree$node.label nnode <- tree$Nnode ntip <- length(tree$tip.label) ## end ## Added by Klaus (2013-01-16): tx <- tabulate(xmat[, 1]) singles <- which(tx == 1) if (length(singles) > 0) { prev.nodes <- match(singles, xmat[,2]) next.nodes <- match(singles, xmat[,1]) for(j in length(singles):1) { i <- singles[j] xmat[prev.nodes[j], 2] <- xmat[next.nodes[j], 2] elen[prev.nodes[j]] <- elen[prev.nodes[j]] + elen[next.nodes[j]] } xmat <- xmat[-next.nodes,] elen <- elen[-next.nodes] if (!is.null(node.lab)) node.lab <- node.lab[-c(singles - ntip)] nnode = nnode - as.integer(length(singles)) tmp = integer(max(xmat)) tmp[sort(unique(as.vector(xmat)))] = as.integer(c(1:(ntip+nnode))) xmat[] = tmp[xmat] } # End tree$edge <- xmat tree$edge.length <- elen ## added by Elizabeth Purdom (2008-06-19): tree$node.label <- node.lab tree$Nnode <- nnode ## end tree }