# [Rd] Minimum of an ordered factor

Martin Maechler maechler at stat.math.ethz.ch
Wed Jan 5 16:26:59 CET 2011

```>>>>> Thaler, Thorn, LAUSANNE, Applied Mathematics <Thorn.Thaler at rdls.nestle.com>
>>>>>     on Wed, 5 Jan 2011 11:20:47 +0100 writes:

> Hi everybody, Is there a particular reason, why this code
> does not work as intended:

> z <- factor(LETTERS[1:3], ordered = TRUE)
> u <- 4:6
> min(z[u > 4])

> Error in Summary.factor(2:3, na.rm = FALSE) :
>   min not meaningful for factors

> I agree that min is indeed not meaningful for not ordered
> factors, but it makes sense for ordered
> factors. Especially since

> z < z
> sort(z)

> _ARE_ defined and work as expected.

I agree that it is natural then, to expect  min(), max() and
range() to work as well.

> Of course I can do something like

> sort(z[u>4])

> but this does not enhance readability of my code. Thus, I

> Summary.ordered <- function(..., na.rm) {

>   ok <- switch(.Generic, max = , min = , range = TRUE,
> FALSE)

>   if (!ok) {

>     warning(sprintf("'%s' is not meaningful for ordered
> factors", .Generic))

>     return(NA)

>   }

>   args <- list(...)

>   level.list <- lapply(args, levels)

>   level.set <- Reduce(union, level.list)

>   if (!all(sapply(args, is.ordered)) ||
> !all(sapply(level.list, identical, y = level.set))) {

>     stop(sprintf("'%s' is only meaningful for ordered
> factors if all arguments are ordered factors with the same
> level sets",

>                  .Generic))

>   }

>   codes <- lapply(args, as.integer)

>   ind <- do.call(.Generic, c(codes, na.rm = na.rm))

>   factor(level.set[ind], levels = level.set, ordered =
> TRUE)

> }

(the above is now even more garbled than it was already by your
use of HTML-ified e-mail ..)

But your code is fine, even nice, in most parts,
and I will add (most of) it (and some documentation) to R-devel