[R] Simple order() data frame question.

John Kane jrkrideau at yahoo.ca
Thu May 12 17:38:47 CEST 2011


Thanks Matthew,
I had data.table installed but totally forgot about it.

I've only used it once or twice and, IIRC, that was last year. I remember thinking at the time that it was a very handy package but lack of need for this sort of thinglet me forget it.



--- On Thu, 5/12/11, Matthew Dowle <mdowle at mdowle.plus.com> wrote:

> From: Matthew Dowle <mdowle at mdowle.plus.com>
> Subject: Re: [R] Simple order()  data frame question.
> To: r-help at stat.math.ethz.ch
> Received: Thursday, May 12, 2011, 11:23 AM
> 
> With data.table, the following is routine :
> 
> DT[order(a)]   # ascending
> DT[order(-a)]  # descending, if a is numeric
> DT[a>5,sum(z),by=c][order(-V1)]   # sum
> of z group by c, just where a>5, 
> then show me the largest first
> DT[order(-a,b)]  # order by a descending then by b
> ascending, if a and b are 
> both numeric
> 
> It avoids peppering your code with $, and becomes quite
> natural after a 
> short while; especially compound queries such as the 3rd
> example.
> 
> Matthew
> 
> http://datatable.r-forge.r-project.org/
> 
> 
> "Ivan Calandra" <ivan.calandra at uni-hamburg.de>
> wrote in message 
> news:4DCBEC8B.6040806 at uni-hamburg.de...
> I was wondering whether it would be possible to make a
> method for
> data.frame with sort().
> I think it would be more intuitive than using the complex
> construction
> of df[order(df$a),]
> Is there any reason not to make it?
> 
> Ivan
> 
> Le 5/12/2011 15:40, Marc Schwartz a écrit :
> > On May 12, 2011, at 8:09 AM, John Kane wrote:
> >
> >> Argh.  I knew it was at least partly
> obvious.  I never have been able to 
> >> read the order() help page and understand what it
> is saying.
> >>
> >> THanks very much.
> >>
> >> By the way, to me it is counter-intuitive that the
> the command is
> >>
> >>> df1[order(df1[,2],decreasing=TRUE),]
> >> For some reason I keep expecting it to be
> >> order( , df1[,2],decreasing=TRUE)
> >>
> >> So clearly I don't understand what is going on but
> at least I a lot 
> >> better off.  I may be able to get this graph
> to work.
> >
> > John,
> >
> > Perhaps it may be helpful to understand that order()
> does not actually 
> > sort() the data.
> >
> > It returns a vector of indices into the data, where
> those indices are the 
> > sorted ordering of the elements in the vector, or in
> this case, the 
> > column.
> >
> > So you want the output of order() to be used within
> the brackets for the 
> > row *indices*, to reflect the ordering of the column
> (or columns in the 
> > case of a multi-level sort) that you wish to use to
> sort the data frame 
> > rows.
> >
> > set.seed(1)
> > x<- sample(10)
> >
> >> x
> >   [1]  3  4  5 
> 7  2  8  9  6 10  1
> >
> >
> > # sort() actually returns the sorted data
> >> sort(x)
> >   [1]  1  2  3 
> 4  5  6  7  8  9 10
> >
> >
> > # order() returns the indices of 'x' in sorted order
> >> order(x)
> >   [1] 10  5  1  2 
> 3  8  4  6  7  9
> >
> >
> > # This does the same thing as sort()
> >> x[order(x)]
> >   [1]  1  2  3 
> 4  5  6  7  8  9 10
> >
> >
> > set.seed(1)
> > df1<- data.frame(aa = letters[1:10], bb =
> rnorm(10))
> >
> >> df1
> >     aa     
>    bb
> > 1   a -0.6264538
> > 2   b  0.1836433
> > 3   c -0.8356286
> > 4   d  1.5952808
> > 5   e  0.3295078
> > 6   f -0.8204684
> > 7   g  0.4874291
> > 8   h  0.7383247
> > 9   i  0.5757814
> > 10  j -0.3053884
> >
> >
> > # These are the indices of df1$bb in sorted order
> >> order(df1$bb)
> >   [1]  3  6  1 10 
> 2  5  7  9  8  4
> >
> >
> > # Get df1$bb in increasing order
> >> df1$bb[order(df1$bb)]
> >   [1] -0.8356286 -0.8204684 -0.6264538
> -0.3053884  0.1836433  0.3295078
> >   [7]  0.4874291 
> 0.5757814  0.7383247  1.5952808
> >
> >
> > # Same thing as above
> >> sort(df1$bb)
> >   [1] -0.8356286 -0.8204684 -0.6264538
> -0.3053884  0.1836433  0.3295078
> >   [7]  0.4874291 
> 0.5757814  0.7383247  1.5952808
> >
> >
> > You can't use the output of sort() to sort the data
> frame rows, so you 
> > need to use order() to get the ordered indices and
> then use that to 
> > extract the data frame rows in the sort order that you
> desire:
> >
> >> df1[order(df1$bb), ]
> >     aa     
>    bb
> > 3   c -0.8356286
> > 6   f -0.8204684
> > 1   a -0.6264538
> > 10  j -0.3053884
> > 2   b  0.1836433
> > 5   e  0.3295078
> > 7   g  0.4874291
> > 9   i  0.5757814
> > 8   h  0.7383247
> > 4   d  1.5952808
> >
> >
> >> df1[order(df1$bb, decreasing = TRUE), ]
> >     aa     
>    bb
> > 4   d  1.5952808
> > 8   h  0.7383247
> > 9   i  0.5757814
> > 7   g  0.4874291
> > 5   e  0.3295078
> > 2   b  0.1836433
> > 10  j -0.3053884
> > 1   a -0.6264538
> > 6   f -0.8204684
> > 3   c -0.8356286
> >
> >
> > Does that help?
> >
> > Regards,
> >
> > Marc Schwartz
> >
> > ______________________________________________
> > R-help at r-project.org
> mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide 
> > http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained,
> reproducible code.
> >
> 
> -- 
> Ivan CALANDRA
> PhD Student
> University of Hamburg
> Biozentrum Grindel und Zoologisches Museum
> Abt. Säugetiere
> Martin-Luther-King-Platz 3
> D-20146 Hamburg, GERMANY
> +49(0)40 42838 6231
> ivan.calandra at uni-hamburg.de
> 
> **********
> http://www.for771.uni-bonn.de
> http://webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php
> 
> 
> -----Inline Attachment Follows-----
> 
> ______________________________________________
> R-help at r-project.org
> mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained,
> reproducible code.
>



More information about the R-help mailing list