Hiểu hàm order ()


88

Tôi đang cố gắng hiểu làm thế nào order() hoạt động của hàm. Tôi có ấ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 vectơ ban đầu.

Ví dụ,

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

Tôi đã mong đợi điều này sẽ trở lại c(2, 3, 1, 4) , vì danh sách được sắp xếp sẽ là 10 45 50 96.

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

Câu trả lời:


100

Điều này dường như giải thích nó.

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

Bạn có thể đang tìm kiếm rank, nó trả về thứ hạng của các phần 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
để rankcho bạn biết thứ tự của các con số, ordercho bạn biết cách lấy chúng theo thứ tự tăng dần.

plot(a, rank(a)/length(a))sẽ cho một đồ thị của CDF. Tuy nhiên, để xem lý do tại sao lại orderhữu ích, hãy thử cách plot(a, rank(a)/length(a),type="S") này sẽ gây lộn xộn vì dữ liệu không theo 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 chỉ đơn giản là
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
bạn nhận được một đồ thị đường của CDF.

Tôi cá là bạn đang nghĩ đến thứ hạng.


8
Ahh .. Tôi hiểu rồi. order () trả về các chỉ số của vectơ theo thứ tự được sắp xếp. Tuyệt vời, cảm ơn rất nhiều.
jeffshantz

order(a, decreasing = T)rank(a)sẽ trả về một câu trả lời tương đương.
omar

Tôi đang gặp vấn đề với đơn đặt hàng. a<-c(4,2,1,80,13)Sau đó, order(a)nên được 3 4 5 1 2, nhưng kỳ lạ là tôi nhận được3 2 1 5 4
Shoham Debnath

1
@duffymo giúp đỡ một chút ở đây sẽ thực sự được đánh giá cao. Khi nào rankordergiống nhau?
Shoham Debnath

Trên thực tế, order(order(a))sẽ trở lại giống như rank(a) nếu không có ràng buộc. Nếu có thì nó sẽ trả về giống như rank(a, ties.method="first").
jac

33

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

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

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à phần trích dẫn dữ liệu về các lần ghi bàn trong mùa giải NFL 2008, khung dữ liệu mà 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 thực địa được thực hiện trong năm 2008; hơn nữa, giả sử bạn muốn biết khoảng cách của bàn thắng dài nhất trong năm đó, ai đã đá nó, và nó có tốt hay không; bạn cũng muốn biết dài thứ hai, cũng như dài thứ ba, v.v.; và cuối cùng bạn muốn có mục tiêu trường ngắn nhất.

Chà, 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

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

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ì đơn đặt hàng làm. Nó là 'sắp xếp' cho dữ liệu hai chiều; nói cách khác, nó trả về chỉ số số nguyên 1D bao gồm các số hàng để sắp xếp các hàng theo vectơ đó, sẽ cung cấp cho bạn một sắp xếp theo hướng hàng chính xác trên cột, Dist

Đây là cách nó 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ộ khung dữ liệu trên cột Dist, chúng tôi sử dụng 'order' giống hệt như cách 'sort' được sử dụng ở trên :

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

(tôi thường liên kết mảng được trả về từ 'order' với biến 'ndx', viết tắt của 'index', vì tôi sẽ sử dụng nó như một mảng chỉ mục để sắp xếp.)

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

'ndx', thứ được trả về bởi 'sort' sau đó được sử dụng như một mảng chỉ mục để sắp xếp lại khung dữ liệu, 'fg':

fg_sorted = fg[ndx,]

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

Tóm lại, 'sắp xếp' được sử dụng để tạo một 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 như một mảng chỉ mục để sắp xếp lại khung dữ liệu (hoặc ma trận).


2
-1: thứ tự có ý nghĩa khá tốt đối với một vectơ. Thuộc tính cơ bản của thứ tự - rằng [order (a)] được sắp xếp - không được nêu rõ ràng.
Jyotirmoy Bhattacharya

2
Sai lầm. bạn cần phải nhìn lại - 'thuộc tính cơ bản' thực sự được hiển thị rất rõ ràng trong hai dòng mã (nền xám) ở trên. Vì sắp xếp w / 'order' là hai hoạt động riêng biệt, tôi đã hiển thị điều này bằng cách sử dụng hai dòng mã - một dòng tạo vectơ 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 một lời giải thích không chỉ là kết quả, và tôi đã đưa cho anh ấy một lời giải thích, bằng chứng là anh ấy đã chọn câu trả lời của tôi và viết ghi chú ngắn gọn ở trên "Cảm ơn [m] akes perfect sense". 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ó tên "fg_sorted".
doug

24

(Tôi nghĩ có thể hữu ích nếu bạn đưa ra các ý tưởng rất đơn giản ở đây để tóm tắt tài liệu hay được đăng bởi @doug và được @duffymo liên kết; +1 cho từng ý, btw.)

? order cho bạn biết phần tử nào của vectơ gốc cần được đặt đầu tiên, thứ hai, v.v., để sắp xếp vectơ ban đầu, trong khi ? rank cho bạn biết phần tử nào có giá trị thấp nhất, 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  

Như vậy order(a)là nói, 'đặt phần tử thứ ba đầu tiên khi bạn sắp xếp ...', trong khi rank(a)nói, "phần tử đầu tiên là thấp thứ hai ...". (Lưu ý rằng cả hai đều đồng ý về phần tử nào thấp nhất, v.v.; họ chỉ trình bày thông tin theo cách khác nhau.) Vì 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 ta 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 nhau rank()trừ khi vectơ đã được sắp xếp:

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

Ngoài ra, vì order()(về cơ bản) hoạt động trên các cấp độ của dữ liệu, bạn có thể soạn chúng mà không ảnh hưởng đến thông tin, nhưng ngược lại sẽ tạo ra những thứ vô nghĩa:

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

1
orderrankthực sự là nghịch đảo của nhau (ít nhất là miễn là các giá trị trong alà duy nhất). Nếu bạn tưởng tượng từng có tên (/ nhãn) ('1', '2', '3', '4') trên giá trị của chúng, thì giá trị của order(a)cho bạn biết vị trí trong rank(a)mỗi nhãn xảy ra ở đâu (ví dụ: giá trị đầu tiên 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' xuất hiện ở vị trí thứ 3 của order(a)). Chúng là hoán vị nghịch đảo: rank(order(a))= order(rank(a))=1 2 3 4
Glen_b

"? order 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? rank cho bạn biết phần tử nào có giá trị thấp nhất, thấp nhất thứ hai, v.v.". Đây. Đó là tất cả những gì bất cứ ai phải nói. Cuối cùng. Cảm ơn bạn!!
AleksandrH

giải thích ngắn gọn .. người ta cần gì "? order 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? rank cho bạn biết phần tử nào có giá trị thấp nhất, thấp nhất thứ hai , v.v., giá trị. "
sHiBuKaLiDhAsAn

9

Chạy đoạn mã nhỏ này cho phép tôi hiểu chức năng đặt hàng

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-und hieu-the-order- Chức năng-td4664384.html


1
Kết quả không khớp với đầu vào. Bạn phải đã sử dụng một khác nhau xtrong cbind().
Rich Scriven,

Đã sửa đổi liên quan đến nhận xét trên. Hy vọng điều này sẽ giúp :)
adebesin

2

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

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

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

[1] 10 45 50 96

Đoạn mã tôi đã viết cho biết bạn muốn "a" dưới dạng toàn bộ tập hợp con của "a" và bạn muốn nó được sắp xếp theo thứ tự từ giá trị thấp nhất đến cao nhất.


2

Nói một cách dễ hiểu, order() cung cấp vị trí của các phần tử có độ lớn tăng dần.

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


0

chúng giống nhau nhưng không giống nhau

set.seed(0)
x<-matrix(rnorm(10),1)

# one can compute from the other
rank(x)  == col(x)%*%diag(length(x))[order(x),]
order(x) == col(x)%*%diag(length(x))[rank(x),]
# rank can be used to sort
sort(x) == x%*%diag(length(x))[rank(x),]

rank là hoán vị nghịch của thứ tự: all(x==x[order(x)][rank(x)])luôn đúng. một số hoán vị là nghịch đảo của riêng chúng, nhưng hầu hết thì không. nghịch đảo để sắp xếp hoán vị sắp xếp theo thứ tự () là rank (). điều này giải thích tại sao chúng đôi khi giống nhau và khác nhau thì không.
Nick Nassuphis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.