2013-02-11 30 views
13

Tôi muốn sắp xếp một khung dữ liệu theo thứ tự chữ cái của một biến ký tự trong R. Tôi đã cố gắng thực hiện nó với hàm order() nhưng nó biến đổi khung dữ liệu của tôi thành một danh sách. Có ai có một đầu mối?Làm thế nào để sắp xếp một khung dữ liệu theo thứ tự chữ cái của một biến ký tự trong R?

+6

Chào mừng bạn đến với SO! Bạn có thể đăng những gì bạn đã cố gắng làm (mã và dữ liệu) không? – juba

Trả lời

32

Vâng, tôi đã không có vấn đề ở đây:

df <- data.frame(v=1:5, x=sample(LETTERS[1:5],5)) 
df 

# v x 
# 1 1 D 
# 2 2 A 
# 3 3 B 
# 4 4 C 
# 5 5 E 

df <- df[order(df$x),] 
df 

# v x 
# 2 2 A 
# 3 3 B 
# 4 4 C 
# 1 1 D 
# 5 5 E 
6
#sort dataframe by col 
sort.df <- with(df, df[order(sortbythiscolumn) , ]) 

#can also sort by more than one variable: sort by col1 and then by col2 
sort2.df <- with(df, df[order(col1, col2) , ]) 

#sort in reverse order 
sort2.df <- with(df, df[order(col1, -col2) , ]) 
+0

Tôi không nghĩ rằng điều này khá rõ ràng, rằng 'col1' phải là' df $ col1' ở đây. Tôi rất sẵn lòng bỏ phiếu nếu bạn có thể chỉnh sửa phần này. Và bạn có lẽ có thể thêm vào việc sử dụng 'with' ở đây tốt đẹp! – Arun

+3

(+1) Tôi muốn sử dụng 'df [với (df, order (col1, col2)),]', nhưng cả hai dường như giống nhau bên dưới. – Arun

3

Sử dụng order chức năng:

set.seed(1) 
DF <- data.frame(ID= sample(letters[1:26], 15, TRUE), 
       num = sample(1:100, 15, TRUE), 
       random = rnorm(15), 
       stringsAsFactors=FALSE) 
DF[order(DF[,'ID']), ] 
    ID num  random 
10 b 27 0.61982575 
12 e 2 -0.15579551 
5 f 78 0.59390132 
11 f 39 -0.05612874 
1 g 50 -0.04493361 
2 j 72 -0.01619026 
14 j 87 -0.47815006 
3 o 100 0.94383621 
9 q 13 -1.98935170 
8 r 66 0.07456498 
13 r 39 -1.47075238 
15 u 35 0.41794156 
4 x 39 0.82122120 
6 x 94 0.91897737 
7 y 22 0.78213630 

Một giải pháp sẽ được sử dụng orderBy chức năng từ doBy gói:

> library(doBy) 
> orderBy(~ID, DF) 
5

Chức năng arrange trong gói plyr giúp dễ dàng sắp xếp theo nhiều cột. Ví dụ, để sắp xếp DF bởi ID đầu tiên và sau đó giảm num, bạn có thể viết

plyr::arrange(DF, ID, desc(num)) 
0

Điều này thực sự thuộc với @ câu trả lời Ramnath nhưng tôi không thể bình luận như tôi không có đủ uy tín được nêu ra. Bạn cũng có thể sử dụng chức năng arrange từ gói dplyr theo cùng cách với gói plyr.

library(dplyr) 
arrange(DF, ID, desc(num)) 
0

Hàm order() không thành công khi cột có cấp hoặc hệ số. Nó hoạt động đúng khi stringsAsFactors = FALSE được sử dụng trong việc tạo data.frame.

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