# [Rd] reorder [stats] and reorder.factor [lattice]

Warnes, Gregory R gregory_r_warnes at groton.pfizer.com
Fri Sep 3 18:36:12 CEST 2004

```I also have a reorder.factor defined in the gregmisc package.  It has a
slighly different behavior.
It allows
- sorting the factor level names via 'mixedsort', which sorts mixed
numeric/character intelligently so that 'Cis 10mg' comes after
'Cis 5mg' and before 'Taxol 10mg'
- reordering by a numeric order
- reordering by named factor labels.

Combining it with the version provided by Deepayan we get:

reorder.factor <- function(x,
order,
X,
FUN,
sort=mixedsort,
make.ordered = is.ordered(x),
... )
{
constructor <- if (make.ordered) ordered else factor

if (!missing(order))
{
if (is.numeric(order))
order = levels(x)[order]
else
order = order
}
else if (!missing(FUN))
order = names(sort(tapply(X, x, FUN, ...)))
else
order = sort(levels(x))

constructor( x, levels=order)

}

Yielding:

>    # Create a 4 level example factor
>    trt <- factor( sample( c("PLACEBO","300 MG", "600 MG", "1200 MG"),
+                   100, replace=TRUE ) )
>    summary(trt)
1200 MG  300 MG  600 MG PLACEBO
18      24      30      28
>    # Note that the levels are not in a meaningful order.
>
>
>    # Change the order to something useful
>    # default "mixedsort" ordering
>    trt2 <- reorder(trt)
>    summary(trt2)
300 MG  600 MG 1200 MG PLACEBO
24      30      18      28
>    # using indexes:
>    trt3 <- reorder(trt, c(4,2,3,1))
>    summary(trt3)
PLACEBO  300 MG  600 MG 1200 MG
28      24      30      18
>    # using label names:
>    trt4 <- reorder(trt, c("PLACEBO","300 MG", "600 MG", "1200 MG") )
>    summary(trt4)
PLACEBO  300 MG  600 MG 1200 MG
28      24      30      18
>    # using frequency
>    trt5 <- reorder(trt, X=as.numeric(trt), FUN=length)
>    summary(trt5)
1200 MG  300 MG PLACEBO  600 MG
18      24      28      30
>
>
>    # drop out the '300 MG' level
>    trt6 <- reorder(trt, c("PLACEBO", "600 MG", "1200 MG") )
>    summary(trt6)
PLACEBO  600 MG 1200 MG    NA's
28      30      18      24
>

-Greg

(the 'mixedsort' function is available in the gregmisc package, or on
request)

> -----Original Message-----
> From: r-devel-bounces at stat.math.ethz.ch
> [mailto:r-devel-bounces at stat.math.ethz.ch]On Behalf Of Deepayan Sarkar
> Sent: Friday, August 27, 2004 3:32 PM
> To: Prof Brian Ripley
> Cc: r-devel at stat.math.ethz.ch
> Subject: Re: [Rd] reorder [stats] and reorder.factor [lattice]
>
>
> On Friday 27 August 2004 11:17, Prof Brian Ripley wrote:
> > On Fri, 27 Aug 2004, Deepayan Sarkar wrote:
> > > It was recently pointed out on the lists that the S-PLUS
> Trellis suite
> > > has a function called reorder.factor that's useful in
> getting useful
> > > ordering of factors for graphs. I happily went ahead and
> implemented it,
> > > but it turns out that R (not S-PLUS) has a generic called
> reorder (with a
> > > method for "dendrogram"). Naturally, this causes R to
> think I'm defining
> > > a method for "factor", and gives a warning during check because of
> > > mismatching argument names.
> > >
> > > Any suggestions as to what I should do? Retaining S
> compatibility doesn't
> > > seem to be an option. I could make a reorder method for
> "factor" (which
> > > sounds like a good option to me), or rename it to something like
> > > reorderFactor.
> >
> > I am pretty sure you don't want to copy the Trellis call, which is
> >
> > function(Factor, X, Function = mean, ...)
> >
> > and suggests it dates from the days when S3 lookup could
> not distingush
> > functions from other objects by context, hence the
> capitalization.  Even
> > then, it is inconsistent with tapply etc which use FUN.
> >
> > reorder.factor <- function(x, X, FUN=mean)
> >
> > looks about right.  Another problem though: in Trellis
> reorder.factor
> > doesn't just reorder the factor, it makes it an ordered
> factor.  I don't
> > really see why, especially as the modelling functions
> assume that ordered
> > means equally spaced.  If this is to be used more generally
> (as Kjetil
> > Halvorsen suggests) then it should record the scores used to do the
> > ordering in an attribute.
>
> Well, the ordered factor issue had come up before, and I
> currently define this
> as
>
>
> which is different from the S-PLUS version in 2 ways:
>
> 1. for (unordered) factors, it changes the levels, but keeps
> it a factor
>
> 2. it works for non-factors as well (which is moot if it's
> going to be
>    a factor method)
>
>
> Implementation details aside, this seems to me like a good
> candidate for stats
> (although it'll probably be used very little). lattice
> functions (will) have
> an alternative way of determining panel order based on panel
> contents, which
> makes more sense to me in the plotting context.
>
> Deepayan
>
> ______________________________________________
> R-devel at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

LEGAL NOTICE\ Unless expressly stated otherwise, this messag...{{dropped}}

```