8

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

3 Answers 3

7

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.

Sign up to request clarification or add additional context in comments.

2 Comments

column "a" not ordered, but grouped. Order of "a" in data.frame is important.
it means first x$a will be sorted then x$b based on x$a , and then x$c based on x$a and x$b , isn't it?
0

Thank you Spacedman! Your recommendation works well.

x$a <- factor(x$a, levels = unique(x$a), ordered = TRUE)
x[order(x$a,x$b, x$c),]

Following Gavin's comment

   x$a <- factor(x$a, levels = unique(x$a))
   x[order(x$a,x$b, x$c),]

4 Comments

obv that fails if x$a is B B B A A C C A A D D D - but if it's completely grouped then you're done.
in my data set there couldn't be separation in groups.
I think you've gotten the wrong idea about factors. The ordering Spacedman referred to was ordering in the levels. ordered = TRUE produces an ordered factor, which is a special type of factor where there is some semi-quantitative ordering. This type of factor is irrelevant to the problem here.
probably. I'm not really familiar with factors. Thank you for clarification.
0
require(doBy)
orderBy(~ a + b + c, data=x)

1 Comment

This one will change order of column a

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.