Skip to content

tapply changing order of factor levels?

7 messages · jim holtman, Chirantan Kundu, Alain Guillet +1 more

#
Hi,

I don't believe the problem is related to tapply. I would say it is 
because of the factor. In fact, the order of a factor is given by the 
alphanumerical order of his levels. You can see it with levels(myfactor).
I you want to change the order, redefine the levels of myfactor with the 
expected order or use the function ordered.

Alain
Chirantan Kundu wrote:

  
    
#
Jim's advice is patently false. Please read ?tapply for correct details.

Counterexample:
[1] a b c a b c
Levels: c b a
c          b          a 
 0.4545897 -1.0544782  0.4682773   

Bert Gunter
Genentech Nonclinical Statistics


-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
Behalf Of jim holtman
Sent: Wednesday, May 06, 2009 6:57 AM
To: Chirantan Kundu
Cc: r-help at r-project.org
Subject: Re: [R] tapply changing order of factor levels?

The result of 'tapply' is just a named vector and the names are in
alphabetical order.  If you want them printed in a different order, then you
have to specify it.  Since you have the order in 'mylevels', this will work:
int [1:3(1d)] 4 3 2
 - attr(*, "dimnames")=List of 1
  ..$ : chr [1:3] "IN0019800021" "IN0020020064" "IN0020020155"
IN0020020155 IN0019800021 IN0020020064
           2            4            3

        
On Wed, May 6, 2009 at 9:45 AM, Chirantan Kundu <chirantan at 2pirad.com>wrote:

            
mydata<-c("IN0020020155","IN0019800021","IN0020020064","IN0020020155","IN001
9800021","IN0019800021","IN0020020064","IN0020020064","IN0019800021")
http://www.R-project.org/posting-guide.html<http://www.r-project.org/posting
-guide.html>

  
    
#
Hi,

I meant that your problem occured because the levels of mylevels are not 
ordered whereas tapply uses the ordered levels for printing. If you 
order them (look under), you can see the results of the tapply has the 
same order as the levels of myfactor

 >mydata<-c("IN0020020155","IN0019800021","IN0020020064","IN0020020155","IN0019800021","IN0019800021","IN0020020064","IN0020020064","IN0019800021")
 > mylevels<-c("IN0020020155","IN0019800021","IN0020020064")
 > myfactor<-factor(mydata,levels=mylevels)
 > myfactor
[1] IN0020020155 IN0019800021 IN0020020064 IN0020020155 IN0019800021
[6] IN0019800021 IN0020020064 IN0020020064 IN0019800021
Levels: IN0020020155 IN0019800021 IN0020020064
 > levels(myfactor) <- sort(mylevels)
 > myfactor
[1] IN0019800021 IN0020020064 IN0020020155 IN0019800021 IN0020020064
[6] IN0020020064 IN0020020155 IN0020020155 IN0020020064
Levels: IN0019800021 IN0020020064 IN0020020155
 > tapply(myfactor,mydata,length)
IN0019800021 IN0020020064 IN0020020155
           4            3            2
Chirantan Kundu wrote: