2010-02-23 276 views
62

我想了解order()函數的工作原理。我的印象是,它返回了索引的排列,當排序時,它會對原始向量進行排序。瞭解訂單()函數

例如,

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

我本來期望這回c(2, 3, 1, 4),因爲排序的名單將是10 45 50 96

有人能幫助我理解這個函數的返回值?

回答

74

This似乎可以解釋它。

order定義是a[order(a)]是 遞增的順序。這適用於您的示例,其中正確的 順序是第四,第二,第一,然後是第三個元素。

你可能一直在尋找rank,返回 要素的排名
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
所以rank告訴你什麼樣的順序號在, order告訴你如何讓它們按升序排列。

plot(a, rank(a)/length(a))將給出CDF的圖表。要知道爲什麼 order是有用的,但是,嘗試plot(a, rank(a)/length(a),type="S") 這給出了一個爛攤子,因爲數據是不是在。如果你沒有遞增的順序


oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
或者乾脆
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
你會得到CDF的折線圖。

我敢打賭你在考慮排名。

+5

啊..我現在明白了。 order()以排序順序返回矢量的索引。非常好,非常感謝。 – jeffshantz 2010-02-23 02:27:48

+0

'order(a,decrease = T)'和'rank(a)'會返回一個等價的答案。 – omar 2016-05-24 11:10:28

+0

我有訂單問題。 'a <-c(4,2,1,80,13)' 然後'命令(a)'應該是'3 4 5 1 2',但奇怪的是我得到了'3 2 1 5 4'' – 2016-05-27 11:42:01

30

排序一維向量或數據的單個列,只需調用排序功能,並通過在你的序列。

在另一方面,順序功能是必要的數據維數據進行排序。 - 即,在一個矩陣或數據幀收集的數據的多個列。

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 

這裏是在2008年的NFL賽季場均出手數據的摘錄,一個數據幀我已經被稱爲「FG」。假設這10個數據點代表了2008年嘗試的所有實地目標;進一步假設你想知道那一年嘗試的最長射門得分的距離,誰踢了它,以及它是否成功;你也想知道第二長和第三長等;最後你想要最短的投籃嘗試。

那麼,你可能只是這樣做:

sort(fg$Dist, decreasing=T) 

返回:50 48 43 37 34 32 26 25 25 20

這是正確的,但不是非常有用 - 它告訴我們最長的投籃嘗試的距離,第二長的......以及最短的距離;然而,這只是我們所知道的 - 例如,我們不知道踢球者是誰,是否嘗試成功等等。當然,我們需要整個數據框按「Dist」列排序(換句話說,我們要DIST整理所有數據行對單個屬性 這將是這樣的:。

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 

這是爲了確實它是二維的數據「排序」。 ;換言之,它返回由行號組成的一維整數索引,以便根據該向量對行進行排序,從而在列上給出正確的面向行的排序,D ist

下面是它的工作原理。以上,被用來排列Dist列;對DIST列中的整個數據幀進行排序,我們使用「訂單」 完全相同的方式如上述使用「排序」:

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

(ⅰ通常結合在陣列從「訂單」返回到可變。「NDX」,它表示 爲「索引」,因爲我要使用它作爲索引數組排序)

,這是第1步,這裏是第2步:

「NDX」,什麼是然後用'sort'返回,作爲索引數組重新排序 dataframe,'f g':

fg_sorted = fg[ndx,] 

fg_sorted是緊接在上面的重新排序的數據幀。

總之,'sort'用於創建一個索引數組(它指定要排序的列的排序順序),然​​後將其用作索引數組來重新排序數據幀(或矩陣)。

+2

-1:順序對於矢量來說很有意義。訂單的基本屬性 - [訂單(a)]排序 - 沒有明確說明。 – 2010-02-23 03:32:16

+2

錯誤。你需要再看一遍 - 「基本屬性」的確在上面的兩行(灰色背景)代碼行中顯示得非常清晰。因爲排序w /'order'是兩個單獨的操作,我使用兩行代碼顯示了這一點 - 一個創建索引向量,第二行使用該索引執行排序。 OP要求解釋的不僅僅是一個結果,而且我給了他一個,他證明了他選擇了我的答案,並在「Thanks [m] akes perfect sense」上面寫了簡短說明。我甚至將最終結果綁定到一個名爲「fg_sorted」的變量。 – doug 2010-04-03 16:19:41

16

(我想這可能是有益的非常簡單地在這裏奠定了思想總結好材料張貼@doug,&鏈接通過@duffymo; +1到每個,順便說一句)

?order告訴你原始矢量的哪個元素需要放在第一個,第二個等位置,以便對原始矢量進行排序,而?rank則告訴您哪個元素具有最小值,第二小值等。例如:

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

所以order(a)在說,「先當把第三個元素,你的排序...',而rank(a)則表示'第一個元素是第二低...'。 (請注意,他們都同意其元素是最低等;他們只是呈現的信息是不同的。)因此,我們看到,我們可以使用order()排序,但我們不能用rank()這樣:

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

在一般情況下,order()將不等於rank()除非載體已經被排序:

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

而且,由於order()是(本質)操作過的數據的行列,你可以撰寫他們在不影響信息,但其他方式產生亂碼:

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

'order'和'rank'實際上是相互顛倒的(至少只要'a'中的值是唯一的)。如果你想象它們的值都有名稱(/標籤)('1','2','3','4'),那麼'order(a)'的值告訴你'rank(a )'每個標籤都出現在(例如(a)'(3)的第一個值告訴你'rank(a)'的第三個位置出現'1',反之亦然(例如rank(a)'(3)的第二個值)告訴你'2'出現在'order(a)''的第三個位置。它們是相反的排列:「order(order(a))'='order(rank(a))'='1 2 3 4'' – 2013-09-27 06:43:27

+0

」?order告訴你哪個原始矢量元素需要先放置,第二等,以便對原始矢量進行排序,而?rank指示哪個元素具有最低,第二低等等值。「那裏。這是所有人都必須說的。最後。謝謝!! – AleksandrH 2017-12-29 21:03:32

+0

簡潔地解釋了......需要什麼「?」順序告訴你哪個原始矢量的哪個元素需要被放置第一,第二等,以便對原始矢量進行排序,而?rank告訴你哪個元素具有最低,第二最低值等。「 – sKaLiDhAsAn 2018-03-06 06:25:45

3

運行這一小段代碼讓我明白的順序功能

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 

參考:http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html

+1

結果與輸入不匹配。你必須在'cbind()'中使用另一個'x'。 – 2016-09-23 21:51:15

+0

關於上述評論修改。希望這可以幫助 :) – adebesin 2016-09-24 12:38:18

1

這可以幫助你在某個時候。

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

你得到的是

[1] 10 45 50 96 

我寫的代碼表示想要「一」作爲一個整體子集「一」,你希望它從最低責令最高值。

0

簡而言之,order()給出了增加幅度的元素的位置。

例如,order(c(10,20,30))會給1,2,3order(c(30,20,10))會給3,2,1