# [Rd] order of levels in interaction()

Martin Maechler maechler at stat.math.ethz.ch
Fri Dec 1 10:45:15 CET 2006

```>>>>> "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:
>>
>>
>> '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

```