2010-11-12 52 views
7

Hãy nói rằng tôi có một data.frameLàm thế nào để sắp xếp dataframe trong R với bảo quản thứ tự cột được chỉ định?

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 

Tôi muốn sắp xếp x bởi cột b và c nhưng giữ gìn trật tự của một như trước. x[order(x$b, x$c),] - ngắt thứ tự của cột a. Đây là những gì tôi muốn:

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 

Có cách nào để thực hiện nhanh không?

Hiện tại tôi chạy vòng lặp "cho" và sắp xếp từng tập hợp con, tôi chắc chắn phải có cách tốt hơn.

Cảm ơn bạn! Ilya

Trả lời

7

Nếu cột "a" được ra lệnh rồi, sau đó nó đơn giản này:

> 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 

Nếu cột một không ra lệnh (nhưng được nhóm), tạo ra một nhân tố mới với mức x $ và sử dụng nó.

+0

cột "a" không ra lệnh, nhưng nhóm lại. Thứ tự của "a" trong data.frame là quan trọng. – ilya

+0

nó có nghĩa là x $ a đầu tiên sẽ được sắp xếp sau đó x $ b dựa trên x $ a, và sau đó x $ c dựa trên x $ a và x $ b, phải không? – jazzz

0

Cảm ơn bạn Spacedman! Đề xuất của bạn hoạt động tốt.

x$a <- factor(x$a, levels = unique(x$a), ordered = TRUE) 
x[order(x$a,x$b, x$c),] 

Tiếp theo bình luận của Gavin

x$a <- factor(x$a, levels = unique(x$a)) 
    x[order(x$a,x$b, x$c),] 
+0

obv thất bại nếu x $ a là B B B A A C C A D D D - nhưng nếu nó được nhóm lại hoàn toàn thì bạn đã hoàn tất. – Spacedman

+0

trong tập dữ liệu của tôi, không thể tách nhóm. – ilya

+0

Tôi nghĩ bạn đã hiểu sai về các yếu tố. Các Spacedman đặt hàng được gọi là đặt hàng trong các cấp. 'ordered = TRUE' tạo ra một hệ số ** được sắp xếp **, đây là một loại yếu tố đặc biệt khi có một số thứ tự bán định lượng. Loại yếu tố này không liên quan đến vấn đề ở đây. –

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

Điều này sẽ thay đổi thứ tự cột – ilya

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