2010-11-03 127 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')])