2010-11-03 81 views
5

我有900000行和R. 11列的数据帧中的列名和类型如下:排序数据

column name: date/mcode/mname/ycode/yname/yissue/bsent /breturn/tsent /treturn/csales 
type:  Date/Char/Char/Char/Char/Numeric/Numeric/Numeric/Numeric/Numeric/Numeric 

欲按以下顺序通过这些变量的数据进行排序:

  1. 日期
  2. 的MCode
  3. ycode
  4. yissue

这里级别的顺序很重要,即它们应该先按日期排序,如果有相同的日期,它们应该按mcode排序,等等。我如何在R中做到这一点?

+2

读的'帮助第一段(排序)'回答你的问题。 – 2010-11-03 15:49:43

+1

得到下面的答案后,我确信我做了正确的事情。我♥堆栈溢出。 – 2010-11-03 19:12:37

回答

10

也许像这样?

> df<- data.frame(a=rev(1:10), b=rep(c(2,1),5), c=rnorm(10)) 
> df 
    a b   c 
1 10 2 -0.85212079 
2 9 1 -0.46199463 
3 8 2 -1.52374565 
4 7 1 0.28904717 
5 6 2 -0.91609012 
6 5 1 1.60448783 
7 4 2 0.51249796 
8 3 1 -1.35119089 
9 2 2 -0.55497745 
10 1 1 -0.05723538 
> with(df, df[order(a, b, c), ]) 
    a b   c 
10 1 1 -0.05723538 
9 2 2 -0.55497745 
8 3 1 -1.35119089 
7 4 2 0.51249796 
6 5 1 1.60448783 
5 6 2 -0.91609012 
4 7 1 0.28904717 
3 8 2 -1.52374565 
2 9 1 -0.46199463 
1 10 2 -0.85212079 

“顺序”功能可以采取若干向量作为参数。

+5

你也可以在一个参数的前面加上 - 按升序排序,而不是按照该标准排序,例如order(df $ b,-df $ a,df $ c)。 – caracal 2010-11-03 14:58:08

+0

不错,很好的附录 – jbremnant 2010-11-03 15:21:41

8

基于早期的解决方案,这里有两种其他方法。第二种方法需要plyr。

df.sorted = df[do.call(order, df[names(df)]),]; 
df.sorted = arrange(df, a, b, c) 
4

如果上述答案的照亮你的火,你可以随时使用orderBy()函数从doBy包:

require(doBy) 
sortedData <- orderBy(~date+mcode+ycode+yissue , data=unsortedData) 

正如你可能直观地想到,可以把负号前面任何变量将其降序排序。

orderBy()没有什么神奇的。正如文档所述,它是一个“order()函数的包装器 - 重要的区别是可以通过模型公式给出要排序的变量。”

我发现语法更容易记住。

1

其他注意事项:使用-c()逆转排序因子或字符列

with(df, df[order(a, b, -c(myCharCol)), ]) 

你也可以添加一个载体,只挑某些列

with(df, df[order(a, b, c), c('a','b','x','y')])