2011-07-20 42 views
14

Tôi đang cố gắng sắp xếp lại các hàng của một khung dữ liệu theo hai yếu tố. Đối với yếu tố đầu tiên tôi hài lòng với thứ tự mặc định. Đối với yếu tố thứ hai, tôi muốn áp đặt thứ tự tùy chỉnh của riêng mình cho các hàng. Dưới đây là một số dữ liệu giả:Đặt khung dữ liệu theo hai cột trong R

dat <- data.frame(apple=rep(LETTERS[1:10], 3), 
        orange=c(rep("agg", 10), rep("org", 10), rep("fut", 10)), 
        pear=rnorm(30, 10), 
        grape=rnorm(30, 10)) 

Tôi muốn đặt hàng "táo" một cách cụ thể:

appleOrdered <- c("E", "D", "J", "A", "F", "G", "I", "B", "H", "C") 

Tôi đã thử điều này:

dat <- dat[with(dat, order(orange, rep(appleOrdered, 3))), ] 

Nhưng nó có vẻ đặt "apple" vào một thứ tự ngẫu nhiên. Bất kỳ đề xuất? Cảm ơn.

+0

Liên quan đến [Làm thế nào để loại một vector dựa trên các giá trị khác] (http://stackoverflow.com/questions/1568511/how-do-i-sort-one-vector-based-on-values-of-another) –

Trả lời

10

Sắp xếp lại các mức yếu tố:

dat[with(dat, order(orange, as.integer(factor(apple, appleOrdered)))), ] 
+1

Điều này hoạt động tuyệt vời, cảm ơn. Có lý do nào để kết thúc cuộc gọi yếu tố trong as.integer() không? Loại bỏ nó dường như cung cấp cho chính xác cùng một kết quả. – Steve

+0

Âm thanh tìm thấy - Tôi không tích cực nếu thứ tự sắp xếp yếu tố được xác định bởi các cấp hoặc as.character() của nó. – Charles

11

Hãy thử sử dụng một yếu tố với các mức theo thứ tự mong muốn và arrange chức năng từ plyr:

dat$apple <- factor(dat$apple,levels=appleOrdered) 
arrange(dat,orange,apple) 
+0

Điều này hoạt động tuyệt vời, cảm ơn. – Steve

+0

bạn không cần 'order = TRUE'. –

Các vấn đề liên quan