Hi Ron,
here you go:
emy <- c(1995L, 2000L, 2005L, 2010L)
times <- c(1994L, 2003L, 2008L, 2011L)
cut3 <- function (x, breaks, labels = NULL, include.lowest = FALSE,
right = TRUE, var = "italic(d)",
dig.lab = 3L, 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 {
breaks <-
seq.int(rx[1L], rx[2L], length.out = nb)
breaks[c(1L, nb)] <- c(rx[1L] - dx/1000, rx[2L] +
dx/1000)
}
} 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(12L, dig.lab)) {
ch.br <- formatC(0 + breaks, digits = dig, width = 1L)
if (ok <- all(
ch.br[-1L] !=
ch.br[-nb]))
break
}
labels <- if (ok)
paste0("{",
ch.br[-nb], ifelse (right, "<", "<="), var,
"}",
ifelse(right, "<=", "<"),
ch.br[-1L])
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("lengths of 'breaks' and 'labels' differ")
code <- .bincode(x, breaks, right, include.lowest)
res <- if (codes.only)
code else factor(code, seq_along(labels), labels, ordered =
ordered_result)
res <- as.character(res)
int <- findInterval(x, breaks, right)
if (length(ind <- which(int == 0L)) != 0L)
res[ind] <- paste0(breaks[1], "<", var)
if (length(ind <- which(int == length(breaks))) != 0L)
res[ind] <- paste0(var, ">", breaks[length(breaks)])
factor(res)
}
lbls <- expression(
italic(d)<=1995,{1995<italic(d)}<=2000,{2000<italic(d)}<=2005,
{2005<italic(d)}<=2010,italic(d)>2010)
lbls
parse(text=as.character(cut3(times, emy)))
I took cut.default and modified it. It's not pretty, but works fine.
Cheers
Brian