94

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

例えば、

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

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

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

4

7 に答える 7

104

これで説明がつきそうです。

の定義は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
rankorder

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

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

于 2010-02-23T01:46:40.260 に答える
33

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

一方、順序関数は、データの 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 整数インデックスを返すので、そのベクトルに従って行を並べ替えると、列Distで正しい行指向の並べ替えが得られます。

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

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

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

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

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

fg_sorted = fg[ndx,]

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

つまり、「並べ替え」を使用してインデックス配列 (並べ替えたい列の並べ替え順序を指定) を作成し、それをインデックス配列として使用してデータフレーム (またはマトリックス) を並べ替えます。

于 2010-02-23T02:30:08.027 に答える
26

(@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  
于 2013-02-25T01:41:03.697 に答える
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

于 2016-09-23T21:33:46.643 に答える