From maechler at stat.math.ethz.ch  Fri Dec  1 10:45:15 2006
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Fri, 1 Dec 2006 10:45:15 +0100
Subject: [Rd] order of levels in interaction()
In-Reply-To: <Pine.LNX.4.64.0611302146210.19267@gannet.stats.ox.ac.uk>
References: <eb555e660611301325o3f255372t4bced4bd0c51e52d@mail.gmail.com>
	<Pine.LNX.4.64.0611302146210.19267@gannet.stats.ox.ac.uk>
Message-ID: <17775.63915.927274.797937@stat.math.ethz.ch>

>>>>> "BDR" == Prof Brian Ripley <ripley at stats.ox.ac.uk>
>>>>>     on Thu, 30 Nov 2006 21:48:35 +0000 (GMT) writes:

    BDR> On Thu, 30 Nov 2006, Deepayan Sarkar wrote:
    >> Hi,
    >> 
    >> ?interaction says:
    >> 
    >> See Also:
    >> 
    >> 'factor'; ':' where 'f:g' is the similar to
    >> 'interaction(f, g, sep=":")' when 'f' and 'g' are
    >> factors.
    >> 
    >> This is not quite true (or maybe 'similar' is the
    >> operative word), since:
    >> 
    >>> f <- factor(1:3); g <- factor(letters[1:3])
    >>> levels(f:g)
    >>   [1] "1:a" "1:b" "1:c" "2:a" "2:b" "2:c" "3:a" "3:b" "3:c"
    >>> levels(interaction(f, g, sep = ":"))
    >>   [1] "1:a" "2:a" "3:a" "1:b" "2:b" "3:b" "1:c" "2:c" "3:c"
    >> 
    >> Note the different order of the levels. I like the order
    >> in f:g better (and at least one other person agrees [1]
    >> ), but I also want the flexibility of having a 'sep'
    >> argument. Would it be possible to change interaction to
    >> allow this? A simple fix that makes interaction behave
    >> like ":" is to replace

    BDR> No, for it also says

    BDR>       The levels are ordered so the level of the first
    BDR> factor varies fastest, then the second and so on.  This
    BDR> is the reverse of lexicographic ordering, and differs
    BDR> from ':'.  (It is done this way for compatibility with S.)

    BDR> and reversing it would break things.  (It does, I tried
    BDR> it a while back.)

yes, indeed  {{ and Deepayan should have ... :-) .. }}

But instead of having Deepayan and other users write their own
customized version of interaction() and having interaction2()
end up in one of those CRAN packages ( ;-} ), we could add a new
argument to interaction()  which allows the new behavior - not
active by default, of course.

I'm happy to do this; the only question remaining is how the
argument should be called, and if it's sufficient to have it
logical, or if there are more variations that should be
considered (I think not).

My quick proposals (name and default):

    reverse = FALSE
    orderFirst = FALSE


    >> as.vector(outer(l, lvs, paste, sep = sep))
    >> 
    >> with
    >> 
    >> as.vector(t(outer(l, lvs, paste, sep = sep)))
    >> 
    >> in interaction.
    >> 
    >> -Deepayan
    >> 
    >> [1]
    >> http://tolstoy.newcastle.edu.au/R/help/06/08/32638.html

Martin



[Rd] order of levels in interaction()
Martin Maechler