order()関数を理解する


88

order()関数がどのように機能するかを理解しようとしています。インデックスの順列が返され、並べ替えると元のベクトルが並べ替えられるという印象を受けました。

例えば、

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

c(2, 3, 1, 4)ソートされたリストは1045 50 96になるので、これが返されることを期待していました。

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

回答:


100

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

定義orderISa[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
ので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の折れ線グラフを取得した場合。

私はあなたがランクを考えているに違いない。


8
ああ..なるほど。order()は、ベクトルのインデックスをソートされた順序で返します。素晴らしい、どうもありがとう。
jeffshantz 2010

order(a, decreasing = T)そして、rank(a)同等の答えを返します。
omar 2016年

注文に問題があります。 a<-c(4,2,1,80,13)それならそうあるorder(a)べきですが3 4 5 1 2、奇妙なことに私は得ています3 2 1 5 4
Shoham Debnath 2016年

1
@duffymoここで少し助けていただければ幸いです。ときであるrankorder同じ?
Shoham Debnath 2016年

実際には、同点がない場合order(order(a))と同じように返されます。ある場合は、と同じように返されます。rank(a) rank(a, ties.method="first")
jac 2016

33

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

一方、順序関数は、データを2次元データ、つまり、行列またはデータフレームに収集されたデータの複数の列でソートするために必要です。

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

これは注文が行うことです。2次元データの「ソート」です。言い換えると、行番号で構成される1D整数インデックスを返し、そのベクトルに従って行を並べ替えると、列に対して正しい行指向の並べ替えが行われます。ディストを

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

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

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

それがステップ1でした。これがステップ2です。

'ndx'、 'sort'によって返されるものは、データフレーム 'fg'を並べ替えるためのインデックス配列として使用されます。

fg_sorted = fg[ndx,]

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

つまり、「sort」はインデックス配列(並べ替える列の並べ替え順序を指定)を作成するために使用され、データフレーム(または行列)を並べ替えるためのインデックス配列として使用されます。


2
-1:順序はベクトルにとってかなり理にかなっています。orderの基本的なプロパティ(a [order(a)]がソートされる)は明確に述べられていません。
Jyotirmoy Bhattacharya 2010

2
違う。もう一度確認する必要があります。「基本プロパティ」は、上記の2行(灰色の背景)のコードに非常に明確に示されています。'order'を使用した並べ替えは、2つの別個の操作であるため、2行のコードを使用してこれを示しました。1行目はインデックスベクトルを作成し、2行目はそのインデックスを使用して並べ替えを実行します。OPは結果だけでなく説明を求めましたが、彼が私の答えを選択し、上記の簡単なメモを書いたという事実からも明らかなように、私は彼に説明をしました。最終結果を「fg_sorted」という変数にバインドしました。
ダグ2010

24

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

?orderは、元のベクトルを並べ替えるために、元のベクトルのどの要素を1番目、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  

1
orderrankは実際には互いに逆です(少なくともの値aが一意である限り)。それぞれの値に名前(/ labels)( '1'、 '2'、 '3'、 '4')があると想像すると、の値はorder(a)rank(a)各ラベルのどの位置にあるかを示します(たとえば、の最初の値order(a)(3)は、「1」がの3番目の位置で発生することを示しrank(a)、その逆も同様です(たとえば、rank(a)(3)の2番目の値は、「2」がの3番目の位置で発生することを示しますorder(a))。これらは逆順列です:rank(order(a))= order(rank(a))=1 2 3 4
Glen_b 2013

「?orderは、元のベクトルを並べ替えるために、元のベクトルのどの要素を1番目、2番目などに配置する必要があるかを示します。一方、?rankは、どの要素の値が最も低く、2番目に低いかなどを示します。」そこ。それは誰もが言わなければならなかったすべてです。最後に。ありがとうございました!!
AleksandrH

簡潔に説明された..必要なもの "?orderは、元のベクトルを並べ替えるために、元のベクトルのどの要素を最初、2番目などに配置する必要があるかを示します。一方、?rankは、どの要素が最も低く、2番目に低いかを示します。 、などの値。 "
sHiBuKaLiDhAsAn 2018年

9

この小さなコードを実行することで、注文機能を理解することができました

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
結果が入力と一致しません。あなたは、異なる使用していなければなりませんxでしcbind()
リッチスクリベン2016

上記のコメントに関して修正。これがお役に立て
ば幸いです

2

これは、ある時点で役立つ可能性があります。

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,3order(c(30,20,10))なります3,2,1


0

それらは似ていますが同じではありません

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),]

ランクは順序の逆順列です:all(x==x[order(x)][rank(x)])常に真です。一部の順列はそれ自体が逆ですが、ほとんどはそうではありません。order()から出てくるソート順列の逆はrank()です。これは、それらが同じである場合とそうでない場合がある理由を説明しています。
Nick Nassuphis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.