Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sort dataframe in R with specified column order preservation?

Let's say I have a data.frame

x <- data.frame(a = c('A','A','A','A','A', 'C','C','C','C', 'B','B','B'),
                b = c('a','c','a','a','c', 'd', 'e','e','d', 'b','b','b'),
                c = c( 7,  3,  2,  4,  5,   3,   1,  1,  5,   5,  2,  3),
                stringsAsFactors = FALSE)

> x
   a b c
1  A a 7
2  A c 3
3  A a 2
4  A a 4
5  A c 5
6  C d 3
7  C e 1
8  C e 1
9  C d 5
10 B b 5
11 B b 2
12 B b 3

I would like to sort x by columns b and c but keeping order of a as before. x[order(x$b, x$c),] - breaks order of column a. This is what I want:

   a b c
3  A a 2
4  A a 4
1  A a 7
2  A c 3
5  A c 5
6  C d 3
9  C d 5
7  C e 1
8  C e 1
11 B b 2
12 B b 3
10 B b 5

Is there a quick way of doing it?

Currently I run "for" loop and sort each subset, I'm sure there must be a better way.

Thank you! Ilya

like image 846
ilya Avatar asked Nov 12 '10 15:11

ilya


1 Answers

If column "a" is ordered already, then its this simple:

> x[order(x$a,x$b, x$c),]
   a b c
3  A a 2
4  A a 4
1  A a 7
2  A c 3
5  A c 5
6  B d 3
9  B d 5
7  B e 1
8  B e 1
11 C b 2
12 C b 3
10 C b 5

If column a isn't ordered (but is grouped), create a new factor with the levels of x$a and use that.

like image 163
Spacedman Avatar answered Sep 24 '22 03:09

Spacedman