ソート、オーダー、ランク関数
書式: 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(..., 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(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 になる