Skip to content

Instantly share code, notes, and snippets.

@krlmlr
Forked from mrdwab/cut2.R
Last active December 11, 2015 11:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save krlmlr/4594243 to your computer and use it in GitHub Desktop.
Save krlmlr/4594243 to your computer and use it in GitHub Desktop.
cut2 <- function (x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE,
dig.lab = 3, ordered_result = FALSE, ...)
{
if (!is.numeric(x))
stop("'x' must be numeric")
if (length(breaks) == 1L) {
if (is.na(breaks) || breaks < 2L)
stop("invalid number of intervals")
nb <- as.integer(breaks + 1)
dx <- diff(rx <- range(x, na.rm = TRUE))
if (dx == 0)
dx <- abs(rx[1L])
breaks <- seq.int(rx[1L] - dx/1000, rx[2L] + dx/1000,
length.out = nb)
}
else nb <- length(breaks <- sort.int(as.double(breaks)))
if (anyDuplicated(breaks))
stop("'breaks' are not unique")
codes.only <- FALSE
if (is.null(labels)) {
for (dig in dig.lab:max(12, dig.lab)) {
ch.br <- paste(formatC(breaks*100, digits = dig, width = 1), '%')
if (ok <- all(ch.br[-1L] != ch.br[-nb]))
break
}
labels <- if (ok)
paste0(if (right)
"("
else "[", ch.br[-nb], ",", ch.br[-1L], if (right)
"]"
else ")")
else paste("Range", seq_len(nb - 1L), sep = "_")
if (ok && include.lowest) {
if (right)
substr(labels[1L], 1L, 1L) <- "["
else substring(labels[nb - 1L], nchar(labels[nb -
1L], "c")) <- "]"
}
}
else if (is.logical(labels) && !labels)
codes.only <- TRUE
else if (length(labels) != nb - 1L)
stop("labels/breaks length conflict")
code <- .bincode(x, breaks, right, include.lowest)
if (codes.only)
code
else factor(code, seq_along(labels), labels, ordered = ordered_result)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment