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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.