COLOR(red){SIZE(20){ソート、オーダー、ランク関数}}

#contents
~
* 数値もしくは複素数ベクトルをソート sort() [#g8e2cc21]

 書式:
 sort(x, partial = NULL, na.last = NA, decreasing = FALSE, method = c("shell", "quick"), index.return = FALSE)
 is.unsorted(x, na.rm = FALSE)

 引数:
 x: 数値もしくは複素数ベクトル
 partial: 部分ソートのための添字ベクトル
 na.last: もし TRUE  ならデータ中の NA  は最後に、さも無ければ先頭に置かれる。
           またもし na.last=NA  なら NA 値は取り除かれる
 decreasing: 論理値。ソートは昇順か降順か?
 method: 使用されるアルゴリズムの指定。"shell" か "quick"。"s" または "q"  だけで良い
 index.return: 論理値。オーダーを表す添字ベクトルも返すかどうか。na.last=NA  の時だけ有効
 na.rm: 論理値。欠損値 NA を取り除くか?

 注意:
 (1) もし partial が NULL で無ければ、partial に与えられた添字に関する部分的ソートが行われる
     (具体的な意味は下の例を参照)
 (2) 文字列のソート順序は使用環境の locale に依存する
 (3) is.unsorted は x  と sort(x) が完全に一致する時 FALSE を返す
 (4) method = "shell" はシェルソート法を使用。オーダー O(n^{4/3}) のバージョン
 (5) method ="quick" はクイックソート法を使用。数値ベクトルの時だけ使える。
     ソートの向きは昇順で、partial  は `NULL'。シェルソートより少し早い
     ( 百万個で二倍程度)が、稀な最悪ケースでは遅くなる

 返り値:
 index.return = FALSE  ならソートされたベクトル
 index.return = TRUE  ならソートされたベクトル(名前 x)と順序付け添字ベクトル(名前 ix)のリスト

 > data(swiss)
 > x <- swiss$Education[1:25]
 > x
 [1] 12  9  5  7 15  7  7  8  7 13  6 12  7 12  5  2  8 28 20  9 10  3 12  6  1
 > sort(x)   # 完全なソート
 [1]  1  2  3  5  5  6  6  7  7  7  7  7  8  8  9  9 10 12 12 12 12 13 15 20 28
 > sort(x, partial = c(10, 15))  # 部分的ソート
 [1]  3  2  5  5  1  6  6  7  7  7  7  8  7  8  9  9 10 12 12 12 12 20 28 13 15
 # 10(15) 番目の値 7 (9) より小さな値は 10 (15)番目より前に
 # 10(15) 番目の値 7 (9) より大きな値は 10 (15)番目より後に来るように部分的に並べ変える
 # 例えばメディアンを求めるためには完全なソートは不要であり、実際この部分ソートが使われている

 >  a <-c(10:3, 2:12)
 >  s <- sort(a, method = "s", index = TRUE)
 > s$x[3]
 [1] 3
 > a[s$ix[3]]
 [1] 3
 > s$x[1:10]
 [1] 2 3 3 4 4 5 5 6 6 7
 > a[s$ix[1:10]]  # ix の意味 (s$x[k] は a の s$ix[k] 番目の要素)
 [1] 2 3 3 4 4 5 5 6 6 7
 > s$x #  シェルソートはタイ(同一値)があっても安定
 [1]  2  3  3  4  4  5  5  6  6  7  7  8  8  9  9 10 10 11 12
 > s$ix
 [1]  9  8 10  7 11  6 12  5 13  4 14  3 15  2 16  1 17 18 19
 > ss <- sort(a, method = "qu", index = TRUE) # クイックソートはタイがあると不安定になる可能性
 $x
 [1]  2  3  3  4  4  5  5  6  6  7  7  8  8  9  9 10 10 11 12
 $ix
 [1]  9  8 10 11  7  6 12  5 13  4 14  3 15  2 16 17  1 18 19

 ## スピード比較
 >  x <- rnorm(1e6)
 > gc()              # ガベージコレクション
           used (Mb) gc trigger (Mb)
 Ncells  374528 10.1     667722 17.9
 Vcells 1139850  8.7    1520464 11.7
 > system.time(x1 <- sort(x, method = "shell")) # シェルソート
 [1] 1.64 0.12 1.83 0.00 0.00
 > system.time(x2 <- sort(x, method = "quick")) # クイックソート
 [1] 0.89 0.04 0.95 0.00 0.00

* 順序 order() [#d220c4a5]

引数ベクトルをソートする添字置換ベクトルを与える。

 書式:
 order(..., na.last = TRUE, decreasing = FALSE)} 
    複数ベクトルを受け付ける
 sort.list(x, partial = NULL, na.last = TRUE, decreasing = FALSE)
    単一ベクトルのみ
 
 引数:
  ...:  同じ長さのベクトルの組
  x:  単一ベクトル
  partial: 部分ソート用の添字ベクトル(S との互換性のためだけにあたえられているが実際は無効)
 decreasing: 論理値。昇順(FALSE)か降順(TRUE)か。
 na.last: もし TRUE なら欠損値 NA は最後におかれる。FALSE なら最初におかれる。NA なら取り除かれる。
 
 注意:
 (1) order の引数 ... 中の最初のベクトルに関しソートが行なわれる。
      もしタイ(同じ値)があれば、第二のベクトル値を参照して順位を決定、云々
 (2) sort.list は オプション index.list=TRUE 付きの sort 関数の結果の ix 成分と同じものを与える。

 > x <- c(1, 1, 3:1, 1:4, 3);  y <- c(9,9:1);  z<-c(2,1:9)
 > (ii <- order(x))
  [1]  1  2  5  6  4  7  3  8 10  9  # 単一ベクトル
 > (ii <- order(x, y))
  [1]  6  5  1  2  7  4 10  8  3  9  # タイ値 1,2,3 を解消するため第二ベクトルを与える
 > (ii <- order(x, y, z))
  [1]  6  5  2  1  7  4 10  8  3  9 #タイ値 1 を解消するため更に第三ベクトルを与える
 > x[ii]
 [1] 1 1 1 1 2 2 3 3 3 4  # いずれの場合もソート結果は同一
 > rbind(x, y, z)[, ii]
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 x    1    1    1    1    2    2    3    3    3     4
 y    5    6    9    9    4    7    1    3    8     2
 z    5    4    1    2    6    3    9    7    2     8
 # 4つのタイ値 1 は z ベクトルにより始めて解消されている。2,3 は y ベクトルですでに解消。 

 > x <- c(5:1, 6:8, 12:9)
 > y <- (x - 5)^2
 > o <- order(x)
 > rbind(x[o], y[o])  # x のオーダーで y を並べ変える
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
 [1,]    1    2    3    4    5    6    7    8    9    10    11    12
 [2,]   16    9    4    1    0    1    4    9   16    25    36    49

 > a <- c(4, 3, 2, NA, 1)
 > order(a)
 [1] 5 3 2 1 4
 > a[order(a)]  # つまり a[order(a, na.last=TRUE)]
 [1]  1  2  3  4 NA
 > a[order(a, na.last=FALSE)]
 [1] NA  1  2  3  4
 > a[order(a, na.last=NA)]  # NA 値を取り除く
 [1] 1 2 3 4

* ランク rank() [#q7a44d40]
数値ベクトルのランク(順位)統計量を計算。タイ(同一の値の組)は平均化される。

 書式:
 rank(x, na.last = TRUE)
 
 引数:
  x:  単一ベクトル
 na.last: もし TRUE なら欠損値 NA は最後におかれる。FALSE なら最初におかれる。NA なら取り除かれる。

 > (r1 <- rank(x1 <- c(3, 1, 4, 59, 26)))
 [1] 2 1 3 5 4   # つまりデータ 3,1,... の順位は 2,1,... ということ
 > order(x1)
 [1] 2 1 3 5 4  # タイが無ければ rank(x1)=order(x1) に他ならない
 > (r2 <- rank(x2 <- c(3, 1, 4, 5, 9, 2, 6, 5, 3, 5)))
 [1]  3.5  1.0  5.0  7.0 10.0  2.0  9.0  7.0  3.5  7.0  
 # タイ値 3 の順序 3,4 が平均化され、順位 (3+4)/2=3.5 になる
 # タイ値 5 の順序 6,7,8 が平均化され、順位 (6+7+8)/3=7.0 になる
 # タイ値 6 の順序 6,7,8 が平均化され、順位 (6+7+8)/3=7.0 になる

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS