R/collapse.singles.R

## collapse.singles.R (2010-07-23)

##    Collapse "Single" Nodes

## Copyright 2006 Ben Bolker

## This file is part of the R-package `ape'.
## See the file ../COPYING for licensing issues.

collapse.singles <- function(tree)
{
    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
    singles <- NA
    while (length(singles) > 0) {
        ## changed by EP to make it slightly more efficient:
        ## tx <- table(xmat[xmat < 0])
        ## singles <- as.numeric(names(tx)[tx < 3])
        tx <- tabulate(xmat[, 1])
        singles <- which(tx == 1)
        ## END
        if (length(singles) > 0) {
            i <- singles[1]
            prev.node <- which(xmat[, 2] == i)
            next.node <- which(xmat[, 1] == i)
            xmat[prev.node, 2] <- xmat[next.node, 2]
            xmat <- xmat[xmat[, 1] != i, ] # drop
            ## changed by EP for the new coding of "phylo" (2006-10-05):
            ## xmat[xmat < i] <- xmat[xmat < i] + 1 ## adjust indices
            xmat[xmat > i] <- xmat[xmat > i] - 1L ## adjust indices # changed '1' by '1L' (2010-07-23)
            ## END
            elen[prev.node] <- elen[prev.node] + elen[next.node]
            ## added by Elizabeth Purdom (2008-06-19):
            if (!is.null(node.lab)) node.lab <- node.lab[-c(i - ntip)]
            nnode <- nnode - 1L
            ## end
            elen <- elen[-next.node]
        }
    }
    tree$edge <- xmat
    tree$edge.length <- elen
    ## added by Elizabeth Purdom (2008-06-19):
    tree$node.label <- node.lab
    tree$Nnode <- nnode
    ## end
    tree
}
gjuggler/ape documentation built on May 17, 2019, 6:03 a.m.