X-Git-Url: https://git.donarmstrong.com/?p=ape.git;a=blobdiff_plain;f=R%2Fcollapse.singles.R;h=e4d2bfe410516dcc0da6cd586cd6c65f40b6e8a6;hp=bbde0a17e003ce464a68dab76afa7d4aa412b416;hb=f5c4abe6ac31486e821d82788bf66b5db2be51d1;hpb=a0436318d70829a2d16134be7ca1d6d454613a20 diff --git a/R/collapse.singles.R b/R/collapse.singles.R index bbde0a1..e4d2bfe 100644 --- a/R/collapse.singles.R +++ b/R/collapse.singles.R @@ -1,14 +1,15 @@ -## collapse.singles.R (2010-07-23) +## collapse.singles.R (2013-01-16) ## Collapse "Single" Nodes -## Copyright 2006 Ben Bolker +## 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): @@ -16,32 +17,26 @@ collapse.singles <- function(tree) 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] + ## 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):