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

匿名 (未验证) 提交于 2019-12-03 03:06:01

问题:

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

回答1:

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.



回答2:

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),] 


回答3:

require(doBy) orderBy(~ a + b + c, data=x) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!