ソート、オーダー、ランク
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
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 になる
# タイ値 6 の順序 6,7,8 が平均化され、順位 (6+7+8)/3=7.0 になる
終了行:
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 になる
# タイ値 6 の順序 6,7,8 が平均化され、順位 (6+7+8)/3=7.0 になる
ページ名: