Works great.  I did a couple changes so as to not affect the original
data.frame (and had to add levels back b/c I removed them in the original
read.csv).

a <- data.frame(V1=letters[rep(4:1,2)], V2=1001:1008)
b <- a
levels(b) <- unique(a$V1)

b$V1 <- factor(b$V1,levels=c('c','d','a','b'))
a.sorted<- a[do.call(order,b[c('V1','V2')]),]

Thank you.

-----------------------------

On Fri, Oct 14, 2011 at 12:50 PM, William Dunlap <wdun...@tibco.com> wrote:

> Set the levels of the factor a$V1 to the order
> in which you want them to be sorted.  E.g.,
>
>  > a <- data.frame(V1=letters[rep(4:1,2)], V2=1001:1008)
>   > a[do.call(order,a[c('V1','V2')]),]
>     V1   V2
>  4  a 1004
>  8  a 1008
>  3  b 1003
>  7  b 1007
>  2  c 1002
>  6  c 1006
>  1  d 1001
>  5  d 1005
>  > a$V1 <- factor(a$V1, levels=c("a","c","d","b"))
>   > a[do.call(order,a[c('V1','V2')]),]
>     V1   V2
>  4  a 1004
>  8  a 1008
>  2  c 1002
>  6  c 1006
>  1  d 1001
>  5  d 1005
>  3  b 1003
>  7  b 1007
>
> This means that tables and plots will be ordered in
> the way as well.  E.g.,
>
>  > with(a, table(V1, V2))
>     V2
>  V1  1001 1002 1003 1004 1005 1006 1007 1008
>    a    0    0    0    1    0    0    0    1
>    c    0    1    0    0    0    1    0    0
>    d    1    0    0    0    1    0    0    0
>    b    0    0    1    0    0    0    1    0
>
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
> > -----Original Message-----
> > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org]
> On Behalf Of Trevor Davies
> > Sent: Friday, October 14, 2011 12:05 PM
> > To: r-help@r-project.org
> > Subject: [R] sorting dataframe by arbitrary order
> >
> > This has been dogging me for a while. I've started making a lot of tables
> > via xtable so the way I want to sort things is not always in alphabetical
> or
> > numerical order.
> >
> > As an example, consider I have a dataframe as follows
> >
> > set.seed(100)
> > a <- data.frame(V1=sample(letters[1:4],100, replace=T),V2=1:100)
> >
> > I know I can sort the columns first by V1 first and then by V2 by:
> >
> > sorted.a <- a[do.call(order,a[c('V1','V2')]),]
> >
> > What I want to do is exactly that but I do not want V1 sorted
> > alphabetically.  Rather, I would like it sorted as 'a','c','d','b'.
> >
> > I know I could do it with a subset, rbind function but I thought there
> may
> > be a more elegant way?
> >
> > Thanks for the help.
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help@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.
>

        [[alternative HTML version deleted]]

______________________________________________
R-help@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.

Reply via email to