2010-11-03 81 views
5

Tôi có một khung dữ liệu với 900.000 hàng và 11 cột trong R. Các tên cột và các loại như sau:dữ liệu Phân loại R

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 

Tôi muốn sắp xếp dữ liệu bằng các biến theo thứ tự sau :

  1. ngày
  2. mcode
  3. ycode
  4. yissue

Thứ tự các cấp là quan trọng ở đây, tức là chúng phải được sắp xếp theo ngày đầu tiên và nếu có ngày trùng nhau, chúng phải được sắp xếp theo mcode, v.v. Làm thế nào tôi có thể làm điều đó trong R?

+2

Đọc đoạn đầu tiên của 'giúp đỡ (sắp xếp) 'trả lời câu hỏi của bạn. –

+1

Sau khi nhận được câu trả lời dưới đây, tôi chắc chắn tôi đã làm đúng. I ♥ Stack tràn. –

Trả lời

10

Có lẽ một cái gì đó như thế này?

> 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 

Chức năng "order" có thể lấy một số vectơ làm đối số.

+5

bạn cũng có thể thêm tiền tố cho một đối số để đặt hàng bằng dấu - để sắp xếp tăng dần thay vì giảm dần chỉ cho tiêu chí đó, ví dụ: thứ tự (df $ b, -df $ a, df $ c). – caracal

+0

đẹp, phụ lục tuyệt vời – jbremnant

8

xây dựng dựa trên giải pháp trước đó, dưới đây là hai cách tiếp cận khác. cách tiếp cận thứ hai yêu cầu plyr.

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

nếu không ai trong số các câu trả lời trên thắp lửa của bạn, bạn luôn có thể sử dụng orderBy() chức năng từ gói doBy:

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

Như bạn bằng trực giác có thể mong đợi, bạn có thể đặt một dấu hiệu tiêu cực ở phía trước bất kỳ biến nào để sắp xếp nó giảm dần.

Không có gì huyền diệu về orderBy(). Như các trạng thái tài liệu, nó là một "trình bao bọc cho hàm order() - sự khác biệt quan trọng là các biến để sắp xếp theo có thể được đưa ra bởi một công thức mô hình."

Tôi tìm cú pháp dễ nhớ hơn.

1

Ghi chú thêm: sử dụng -c() để đảo ngược cột yếu tố loại hoặc vật

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

Ngoài ra bạn có thể thêm một vector để chọn chỉ có một số cột

with(df, df[order(a, b, c), c('a','b','x','y')]) 
Các vấn đề liên quan