【R勉強】sort関数とorder関数の差異点
1.この記事の目的
データ分析では、分析の目的に応じて、データセットから特定のデータを抽出し、特定の統計処理を行うことが頻繁にあります。
<具体例>
①体重の上位100人と下位100人の血圧の平均値を比較
②人口の上位10地区と下位10地区で所得の中央値を比較
③資本金の上位50社と下位50社に分けて線形回帰を実施
こうした具体例を実践するには、平均値や中央値、線形モデルの推定等の統計処理を行う前に、以下のステップを必要があります。
<統計処理に至るまでのステップ>
①抽出の前準備 :特定の変数を基準にデータセットを並び替える。
②データの抽出 :基準を指定し、該当するデータを抽出する。
③データの保存 :必要に応じて別のデータセットとして保存する。
④統計処理の実行:データセット毎に特定の統計処理を行う。
上記ステップの内、特に「①抽出の前準備」のために、データセットの並び替えを、無料統計ソフトのRで行いたい場合、書籍等では「sort関数」と「order関数」を用いると書いてあると思います。しかし、書籍を読むだけでは、両者の細かな違いは分かりにくいと感じました。
<今井耕助「社会科学のためのデータ分析入門(下)」P.289の記載>
両関数の決定的な違いは、order()関数が順番を付された指標ベクトルを返すのに対し、sort()関数は順序づけられたベクトルそのものを返す点である。
そのため、自分自身のRへの理解を深めるため、「sort関数」と「order関数」を実際に使用して、その違いを整理してみました。
2.具体例による「sort関数」と「order関数」の比較
上に記載した具体例①〜③の内、「体重の上位100人と下位100人の血圧の平均値を比較」を想定して、「sort関数」と「order関数」の使ってみました。
(1)データセットの作成
「ID」「Weight(体重)」「BP(血圧)」の3変数でデータセットを作成します。
> dataset <- data.frame(ID = c(1:250), Weight = NA , BP = NA )
各変数は以下のルールに従って生成しました。
1)ID :1〜250までの連番
2)Weight:平均65、標準偏差5の正規分布から乱数を生成
3)BP :平均100、標準偏差15の正規分布から乱数を生成
> dataset$Weight <- rnorm(250,mean = 65,sd = 5)
> dataset$BP <- rnorm(250,mean = 100,sd = 15)
念のため、各変数の概要をsummary関数で確認します。
> summary(dataset)
ID Weight BP
Min. : 1.00 Min. :51.53 Min. : 60.86
1st Qu.: 63.25 1st Qu.:61.55 1st Qu.: 88.47
Median :125.50 Median :65.07 Median : 99.80
Mean :125.50 Mean :64.98 Mean : 98.93
3rd Qu.:187.75 3rd Qu.:68.42 3rd Qu.:108.52
Max. :250.00 Max. :82.67 Max. :136.90
(2)データセットの並替え
A.「sort関数」の場合
ベクトルを指定するとベクトルの要素を昇順(小→大)に並び替える。
> head(sort(dataset$Weight))
[1] 51.53207 51.88928 52.53562 52.60559 53.39350 54.00157
並び替えの順序は引数「decreasing」の設定値で変更できる。
1)decreasing = F の場合:昇順(小→大)に並び替える
2)decreasing = T の場合:降順(大→小)に並び替える
> head(sort(dataset$Weight,decreasing=F))
[1] 51.53207 51.88928 52.53562 52.60559 53.39350 54.00157
> head(sort(dataset$Weight,decreasing=T))
[1] 82.66788 78.12070 77.63852 76.56900 76.27047 74.73019
しかし、ベクトルの要素(データ自体)を返すため、「sort関数」の結果のみで、データセット全体を並び替えることは出来ない。
> head(dataset[sort(dataset$Weight),])
ID Weight BP
51 51 66.95526 112.51246
51.1 51 66.95526 112.51246
52 52 62.55990 77.90658
52.1 52 62.55990 77.90658
53 53 64.39198 94.49370
54 54 59.17374 65.31183
「sort関数」を使って、データセット全体を並替えるには、結果とその行番号を返す引数「index」を設定し、並替え後の行番号を格納する「$ix」を使う。
> head(sort(dataset$Weight,decreasing = F,index=T)$ix)
[1] 245 60 244 249 164 148
> head(dataset[sort(dataset$Weight,decreasing = FALSE,index=T)$ix,])
ID Weight BP
245 245 51.53207 113.33432
60 60 51.88928 85.01228
244 244 52.53562 78.32259
249 249 52.60559 71.83636
164 164 53.39350 72.05493
148 148 54.00157 108.96456
> head(sort(dataset$Weight,decreasing = TRUE,index=T)$ix)
[1] 210 163 1 175 28 136
> head(dataset[sort(dataset$Weight,decreasing = TRUE,index=T)$ix,])
ID Weight BP
210 210 82.66788 89.94053
163 163 78.12070 117.50413
1 1 77.63852 78.93403
175 175 76.56900 105.19112
28 28 76.27047 97.09896
136 136 74.73019 132.92635
B.「order関数」の場合
ベクトルを指定すると、その行番号を昇順(小→大)に並替える。
※ベクトルの要素(今回の場合は体重)は表示されない
> head(order(dataset$Weight))
[1] 245 60 244 249 164 148
並び替えの順序は引数「decreasing」の設定値で変更できる。
1)decreasing = F の場合:昇順(小→大)に並替える
2)decreasing = T の場合:降順(大→小)に並替える
> head(order(dataset$Weight,decreasing = FALSE))
[1] 245 60 244 249 164 148
> head(order(dataset$Weight,decreasing = TRUE))
[1] 210 163 1 175 28 136
行番号を返すため「order関数」の結果で、データセット全体を並び替えることができる。
> head(dataset[order(dataset$Weight,decreasing = FALSE),])
ID Weight BP
245 245 51.53207 113.33432
60 60 51.88928 85.01228
244 244 52.53562 78.32259
249 249 52.60559 71.83636
164 164 53.39350 72.05493
148 148 54.00157 108.96456
> head(dataset[order(dataset$Weight,decreasing = TRUE),])
ID Weight BP
210 210 82.66788 89.94053
163 163 78.12070 117.50413
1 1 77.63852 78.93403
175 175 76.56900 105.19112
28 28 76.27047 97.09896
136 136 74.73019 132.92635
(3)結果のまとめ
この記事の目的にも記載した「データセット全体」を並び替える際には、文法がシンプルな「order関数」を使う方が便利だと思います。
一方で、「データセット全体」を並び替える前に、データセット内の特定ベクトルの傾向を確認する際は「sort関数」を使う方が、楽だと思います。
当たり前のことですが、両関数の違いを理解した上で、場面ごとに適切な関数を用いることが大切だと実感することが出来ました。やはり自ら手を動かしてみるのが統計分析のスキル向上にとっても重要だと思いました。
3.参考サイト
「R sort order 違い」等で検索すると、参考になるサイトがた沢山、出てきます。この記事の説明では分からない場合は、私が参考にしたサイトのリンクを貼っておくので、こちらをご覧になってみてください。
この記事が気に入ったらサポートをしてみませんか?