ソート、オーダー、ランク関数


数値もしくは複素数ベクトルをソート sort()

書式:
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()

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

書式:
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()

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

書式:
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 になる
# タイ値 6 の順序 6,7,8 が平均化され、順位 (6+7+8)/3=7.0 になる

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:17