2010-02-23 32 views
62

Tôi đang cố gắng hiểu cách hoạt động của hàm order(). Tôi đã ấn tượng rằng nó đã trở về một hoán vị của các chỉ số, khi được sắp xếp, sẽ sắp xếp các vector ban đầu.Hiểu hàm order()

Ví dụ,

> a <- c(45,50,10,96) 
> order(a) 
[1] 3 1 2 4 

tôi dự kiến ​​sẽ có ước muốn được trở c(2, 3, 1, 4), kể từ khi danh sách được sắp xếp sẽ là 10 45 50 96.

Ai đó có thể giúp tôi hiểu được giá trị trả về của hàm này?

Trả lời

74

This dường như giải thích.

Định nghĩa của ordera[order(a)] là trong thứ tự tăng dần. Điều này làm việc với ví dụ của bạn, trong đó thứ tự đúng là là phần tử thứ tư, thứ hai, thứ nhất, thứ ba.

Bạn có thể đã được tìm kiếm rank, mà trả về thứ hạng của yếu tố
R> a <- c(4.1, 3.2, 6.1, 3.1)
R> order(a)
[1] 4 2 1 3
R> rank(a)
[1] 3 2 4 1
nên rank cho bạn biết đặt những con số được in, order cho bạn biết làm thế nào để có được chúng theo thứ tự tăng dần.

plot(a, rank(a)/length(a)) sẽ cung cấp biểu đồ của CDF. Để xem tại sao order là hữu ích, tuy nhiên, thử plot(a, rank(a)/length(a),type="S") mang đến cho một mớ hỗn độn, vì dữ liệu không phải là thứ tự tăng dần

Nếu bạn đã làm
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
hoặc đơn giản là
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
bạn nhận được biểu đồ dạng đường của CDF.

Tôi chắc rằng bạn đang nghĩ đến thứ hạng.

+5

Ahh .. Tôi thấy bây giờ. order() trả về các chỉ số của vector theo thứ tự sắp xếp. Tuyệt vời, cảm ơn rất nhiều. – jeffshantz

+0

'thứ tự (a, giảm = T)' và 'xếp hạng (a)' sẽ trả về một câu trả lời tương đương. – omar

+0

Tôi đang gặp sự cố với đơn đặt hàng. 'a <-c (4,2,1,80,13)' Sau đó, 'thứ tự (a) 'phải là' 3 4 5 1 2', nhưng kỳ lạ tôi nhận được '3 2 1 5 4' –

30

Để sắp xếp vector 1D hoặc một cột dữ liệu, chỉ cần gọi hàm sắp xếp và chuyển tiếp chuỗi của bạn.

Mặt khác, trật tự chức năng là cần thiết để sắp xếp dữ liệu hai dữ liệu chiều -. Tức là, nhiều cột dữ liệu thu thập được trong một ma trận hoặc dataframe.

Stadium Home Week Qtr Away Off Def Result  Kicker Dist 
751  Out PHI 14 4 NYG PHI NYG Good  D.Akers 50 
491  Out KC 9 1 OAK OAK KC Good S.Janikowski 32 
702  Out OAK 15 4 CLE CLE OAK Good  P.Dawson 37 
571  Out NE 1 2 OAK OAK NE Missed S.Janikowski 43 
654  Out NYG 11 2 PHI NYG PHI Good  J.Feely 26 
307  Out DEN 14 2 BAL DEN BAL Good  J.Elam 48 
492  Out KC 13 3 DEN KC DEN Good  L.Tynes 34 
691  Out NYJ 17 3 BUF NYJ BUF Good  M.Nugent 25 
164  Out CHI 13 2 GB CHI GB Good  R.Gould 25 
80  Out BAL 1 2 IND IND BAL Good M.Vanderjagt 20 

Đây là trích đoạn dữ liệu cho các nỗ lực mục tiêu của trường trong mùa NFL 2008, một khung dữ liệu tôi gọi là 'fg'.giả sử rằng 10 điểm dữ liệu này đại diện cho tất cả các mục tiêu của trường đã cố gắng trong năm 2008; hơn nữa giả sử bạn muốn biết khoảng cách của mục tiêu trường dài nhất đã cố gắng năm đó, ai đã đá nó, và liệu nó có tốt hay không; bạn cũng muốn biết lần thứ hai dài nhất, cũng như dài thứ hai, vv; và cuối cùng bạn muốn nỗ lực mục tiêu ngắn nhất của trường.

Vâng, bạn chỉ có thể làm điều này:

sort(fg$Dist, decreasing=T) 

trả về: 50 48 43 37 34 32 26 25 25 20

Đó là đúng, nhưng không phải là rất hữu ích - nó nói với chúng tôi khoảng cách của nỗ lực mục tiêu trường dài nhất, dài nhất thứ hai, ... cũng như ngắn nhất; tuy nhiên, đó là tất cả những gì chúng ta biết - ví dụ, chúng ta không biết ai là kicker, cho dù nỗ lực thành công, vv Tất nhiên, chúng ta cần toàn bộ khung dữ liệu được sắp xếp trên cột "Dist" (đặt một cách khác, chúng ta muốn sắp xếp tất cả các hàng dữ liệu về các thuộc tính đơn Quận rằng sẽ trông như thế này:.

Stadium Home Week Qtr Away Off Def Result  Kicker Dist 
751  Out PHI 14 4 NYG PHI NYG Good  D.Akers 50 
307  Out DEN 14 2 BAL DEN BAL Good  J.Elam 48 
571  Out NE 1 2 OAK OAK NE Missed S.Janikowski 43 
702  Out OAK 15 4 CLE CLE OAK Good  P.Dawson 37 
492  Out KC 13 3 DEN KC DEN Good  L.Tynes 34 
491  Out KC 9 1 OAK OAK KC Good S.Janikowski 32 
654  Out NYG 11 2 PHI NYG PHI Good  J.Feely 26 
691  Out NYJ 17 3 BUF NYJ BUF Good  M.Nugent 25 
164  Out CHI 13 2 GB CHI GB Good  R.Gould 25 
80  Out BAL 1 2 IND IND BAL Good M.Vanderjagt 20 

Đây là những gì trật tự không đó là 'sắp xếp' cho dữ liệu hai chiều. , đặt một cách khác, nó trả về chỉ số nguyên 1D bao gồm các số hàng sao cho sắp xếp các hàng theo vectơ đó, sẽ cung cấp cho bạn sắp xếp hàng đúng theo định hướng trên cột, D ist

Đây là cách hoạt động. Ở trên, sắp xếp được sử dụng để sắp xếp cột Dist; để sắp xếp toàn bộ dataframe trên cột Quận, chúng tôi sử dụng 'trật tự' chính xác theo cùng một cách như 'sắp xếp' được sử dụng trên:

ndx = order(fg$Dist, decreasing=T) 

(i thường gắn mảng trở về từ 'trật tự' vào biến . 'ndx', viết tắt cho 'index', bởi vì tôi đang đi để sử dụng nó như một mảng chỉ số để sắp xếp)

đó là bước 1, đây là bước 2:

'ndx', những gì là được trả về bằng 'sắp xếp' sau đó được sử dụng làm mảng chỉ mục để sắp xếp lại khung dữ liệu, 'f g ':

fg_sorted = fg[ndx,] 

fg_sorted là khung dữ liệu được sắp xếp lại ngay lập tức ở trên.

Tóm lại, 'sắp xếp' được sử dụng để tạo mảng chỉ mục (chỉ định thứ tự sắp xếp của cột bạn muốn sắp xếp), sau đó được sử dụng làm mảng chỉ mục để sắp xếp lại dataframe (hoặc ma trận).

+2

-1: thứ tự tạo cảm giác khá tốt cho một vectơ. Các tài sản cơ bản của trật tự - rằng một [thứ tự (a)] được sắp xếp - không được nêu rõ. –

+2

Sai. bạn cần phải nhìn lại - 'tài sản cơ bản' thực sự được hiển thị rất rõ ràng trong hai dòng mã màu xám ở trên. Bởi vì phân loại w/'order' là hai hoạt động riêng biệt, tôi đã chỉ ra điều này bằng cách sử dụng hai dòng mã - một tạo ra vector chỉ mục và dòng thứ hai sử dụng chỉ mục đó để thực hiện sắp xếp. OP yêu cầu giải thích không chỉ là một kết quả, và tôi đã cho anh ta một, bằng chứng là một thực tế rằng ông đã chọn câu trả lời của tôi và viết các lưu ý ngắn gọn ở trên "Cảm ơn [m] akes hoàn hảo ý nghĩa". Tôi thậm chí còn ràng buộc kết quả cuối cùng với một biến được gọi là "fg_sorted". – doug

16

(Tôi nghĩ rằng nó có thể hữu ích để đặt ra những ý tưởng rất đơn giản đây để tóm tắt những nguyên liệu tốt đăng bởi @doug, & liên kết bởi @duffymo;. 1 cho mỗi, btw)

?order cho bạn biết phần tử nào của vector gốc cần được đặt trước, thứ hai, v.v., để sắp xếp vectơ gốc, trong khi ?rank cho bạn biết phần tử nào có giá trị thấp nhất, thứ hai, v.v. Ví dụ:

> a <- c(45, 50, 10, 96) 
> order(a) 
[1] 3 1 2 4 
> rank(a) 
[1] 2 3 1 4 

Vì vậy, order(a) đang nói, 'đặt phần tử thứ ba đầu tiên khi bạn sắp xếp ...', trong khi rank(a) đang nói,' yếu tố đầu tiên là yếu tố thứ hai thấp nhất ... '. (Lưu ý rằng cả hai đều đồng ý về yếu tố nào là thấp nhất, vv .; họ chỉ trình bày các thông tin khác nhau.) Như vậy chúng ta thấy rằng chúng ta có thể sử dụng order() để sắp xếp, nhưng chúng tôi không thể sử dụng rank() theo cách đó:

> a[order(a)] 
[1] 10 45 50 96 
> sort(a) 
[1] 10 45 50 96 
> a[rank(a)] 
[1] 50 10 45 96 

Nói chung, order() sẽ không bằng rank() trừ vector đã được sắp xếp đã:

> b <- sort(a) 
> order(b)==rank(b) 
[1] TRUE TRUE TRUE TRUE 

Ngoài ra, vì order() là (cơ bản) hoạt động trên cấp bậc của dữ liệu, bạn có thể soạn chúng mà không ảnh hưởng đến các thông tin, nhưng cách khác xung quanh sản xuất sai ngữ pháp:

> order(rank(a))==order(a) 
[1] TRUE TRUE TRUE TRUE 
> rank(order(a))==rank(a) 
[1] FALSE FALSE FALSE TRUE 
+1

'thứ tự' và' xếp hạng' thực sự là nghịch đảo của nhau (ít nhất là các giá trị trong 'a' là duy nhất). Nếu bạn tưởng tượng mỗi cái có tên (/ labels) ('1', '2', '3', '4') trên các giá trị của chúng, thì các giá trị của 'order (a)' cho bạn biết vị trí nào trong 'rank (a) 'mỗi nhãn xuất hiện trong (ví dụ:giá trị thứ 1 của 'order (a)' (3) cho bạn biết rằng '1' xuất hiện ở vị trí thứ 3 của 'rank (a)', và ngược lại (ví dụ giá trị thứ 2 của 'rank (a)' (3) cho bạn biết rằng '2' xảy ra ở vị trí thứ 3 của 'thứ tự (a)'). Họ là hoán vị nghịch đảo: 'rank (thứ tự (a))' = 'order (rank (a))' = '1 2 3 4' –

+0

"? Trật tự cho bạn biết phần tử nào của vector gốc cần được đặt trước, thứ hai, v.v., để sắp xếp vectơ gốc, trong khi thứ hạng cho bạn biết phần tử nào có giá trị thấp nhất, thứ hai thấp nhất, v.v. " Ở đó. Đó là tất cả mọi người phải nói. Cuối cùng. Cảm ơn bạn!! – AleksandrH

+0

giải thích ngắn gọn .. những gì người ta cần "? Trật tự cho bạn biết phần tử nào của vectơ ban đầu cần được đặt đầu tiên, thứ hai, v.v., để sắp xếp vectơ ban đầu, trong khi đó thứ hạng cho bạn biết phần tử nào có giá trị thấp nhất, thứ hai thấp nhất, vv, giá trị. " – sKaLiDhAsAn

3

Chạy mảnh này ít mã cho phép tôi để hiểu được chức năng tự

x <- c(3, 22, 5, 1, 77) 

cbind(
    index=1:length(x), 
    rank=rank(x), 
    x, 
    order=order(x), 
    sort=sort(x) 
) 

    index rank x order sort 
[1,]  1 2 3  4 1 
[2,]  2 4 22  1 3 
[3,]  3 3 5  3 5 
[4,]  4 1 1  2 22 
[5,]  5 5 77  5 77 

tham khảo: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html

+1

Kết quả không khớp với đầu vào. Bạn phải sử dụng một 'x' khác trong' cbind() '. –

+0

Sửa đổi liên quan đến các nhận xét ở trên. Hi vọng điêu nay co ich :) – adebesin

1

Điều này có thể giúp bạn tại một số điểm.

a <- c(45,50,10,96) 
a[order(a)] 

Những gì bạn nhận được là

[1] 10 45 50 96 

Mã tôi đã viết cho thấy bạn muốn "a" như một tập hợp con của toàn bộ "a" và bạn muốn nó ra lệnh từ thấp nhất đến giá trị cao nhất.

0

Nói cách đơn giản, order() cho vị trí của các yếu tố tăng cường độ lớn.

Ví dụ, order(c(10,20,30)) sẽ cho 1,2,3order(c(30,20,10)) sẽ cho 3,2,1.