web-dev-qa-db-ja.com

order()関数を理解する

order()関数の動作を理解しようとしています。私は、並べ替えると元のベクトルを並べ替えるインデックスの並べ替えを返したという印象を受けました。

例えば、

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

ソートされたリストは10 45 50 96になるので、これはc(2, 3, 1, 4)を返すと予想していました。

誰かがこの関数の戻り値を理解するのを手伝ってもらえますか?

77
jeffshantz

これ はそれを説明しているようです。

orderの定義は、a[order(a)]が昇順であるということです。これは、正しい順序が4番目、2番目、1番目、3番目の要素の例で機能します。

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
so 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の折れ線グラフを取得します。

ランクを考えているに違いない。

92
duffymo

1Dベクトルまたはデータの単一列をソートするには、sort関数を呼び出してシーケンスを渡します。

一方、データを並べ替えるには、order関数が必要ですtwo-次元データ-つまり、マトリックスまたはデータフレームに収集されたデータの複数の列。

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年に試みられたすべてのフィールドゴールを表していると仮定します。さらに、その年に試みた最長フィールドゴールの距離、キックした人、およびそれが良いかどうかを知りたいとします。また、2番目に長いもの、3番目に長いものなども知りたい。そして最後に、最短フィールドゴールの試みが必要です。

さて、あなたはこれを行うことができます:

sort(fg$Dist, decreasing=T)

返される値:50 48 43 37 34 32 26 25 25 20

これは正しいですが、あまり有用ではありません。フィールドゴール試行の最長距離、2番目に長い距離、そして最短距離を教えてくれます。ただし、それだけがわかっています。たとえば、キッカーが誰であったか、試みが成功したかどうかなどはわかりません。もちろん、「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

これはorderが行うことです。 2次元データの場合は「ソート」です。別の言い方をすれば、行番号で構成される1D整数インデックスを返します。その結果、そのベクトルに従って行をソートすると、列に対して正しい行指向のソートが得られますDist

仕組みは次のとおりです。上記では、sortがDist列のソートに使用されました。 Dist列のデータフレーム全体を並べ替えるには、「order」を使用します。上で「sort」を使用するのとまったく同じ方法を使用します。

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

(通常、「order」から返された配列を、「index」を表す変数「ndx」にバインドします。これは、ソートするためのインデックス配列として使用するためです。)

それがステップ1で、ここにステップ2があります。

「ndx」、「sort」によって返されるものは、re-orderデータフレーム「fg」へのインデックス配列として使用されます。

fg_sorted = fg[ndx,]

fg_sortedは、すぐ上に並べ替えられたデータフレームです。

要するに、 'sort'はインデックス配列(ソートする列のソート順を指定する)を作成するために使用され、その後、データフレーム(またはマトリックス)を再配列するためのインデックス配列として使用されます。

32
doug

(@ dougによって投稿された優れた資料を要約するために、ここにアイデアを非常に簡単にレイアウトすることは役立つと思いました、および@duffymoによってリンクされました; +1にそれぞれ、btw。)

?order は、元のベクターをソートするために、元のベクターのどの要素を最初、2番目などに配置する必要があるかを示しますが、 ?rank はどの要素を示します最低値、2番目に低い値などがあります。例えば:

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

order(a)は、「並べ替えるときに最初に3番目の要素を置く...」と言っていますが、rank(a)は、「最初の要素が2番目に小さい...」と言っています。 (どちらの要素が最も低いかなど、両者は一致していることに注意してください。情報の表示方法が異なるだけです。)したがって、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  
19
gung

この小さなコードを実行すると、順序関数を理解できました

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

6
adebesin

これはある時点で役立ちます。

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

あなたが得るものは

[1] 10 45 50 96

私が書いたコードは、 "a"のサブセット全体として "a"が必要であり、最低値から最高値の順に並べたいことを示しています。

2

簡単に言えば、order()は、大きさが増加する要素の位置を示します。

たとえば、order(c(10,20,30))1,2,を、order(c(30,20,10)),2,1を返します。

1
Arnab Jana