2017年8月8日火曜日

R 練習問題

Rの練習問題を作ってみました。今回の対象は次のようなデータフレームです。試験の点数処理を題材としてみました。データを作るスクリプトです。乱数でとも思いましたが、同じ結果の方が見やすいでしょうから。

データはこんな風です。3組それぞれ5人の国・数・英の点数です。

問題と出力です。
#問1 dに個人ごとの計を付加

#問2 計順にソートして表示

#問3 dに計で学年順位を付加

#問4 組ごと計順に表示

#問5 教科間の相関係数

#問6 科目別箱髭図

#問7 国の組別箱髭図

#問8 教科集計

#問9 計の度数分布

#問10 科目別平均

#問11 計の組別平均

#問12 科目別組別平均

#問13 国の組別平均・最高・最低

#問14 国50未満を抽出

#問15 国50未満を抽出、組番国のみ表示

#問16 数40以上英50以上を抽出

#問17 数30以上を計順に表示

#問18 科目別、成績順、組番

#問19 計の20点刻み度数分布図

#問20 科目別5点刻み度数分布表


解答


終わりに
この練習問題では科目は横に展開し、組は縦に展開しているので、科目ごとと組ごとの扱いが違って来る。
apply系の命令をうまく使うことは難しい。この練習問題では、結構面白い使い方ができたと自負している。

簡単にポイントにふれておく。

問1 ①新たな列の付けくわえ方②d[3:5]はデータフレームdの3列目から5列目に限定している。データフレームはベクトルのリストであるので、d[3:5]で3列目から5列目が取り出される。これがmatrixならば、d[,3:5]とカンマとつけなければならない。もちろんデータフレームでもこのように指定してもよいが。③行集計にrowSumsを用いた。apply(d[3:5],1,sum)としてもよい。

問2 ①ソートにはorderを用いるのが良い。単一のベクトルをソートするにはsortを用いればよいが、キーでソートするようなときはorderがよい。orderは昇順にソートするので、高得点の方が先に来るように、マイナスした。desc=Tを用いてもよいが、おしゃれじゃない。②行番号で指定するので、d[order(-d$計),]と、コンマが必要となる。問1で述べたように、ここでコンマがないと、列の指定となってしまう。

問3 ①順位はrank。②引数のt=は ties.method = c("average", "first", "random", "max", "min")である。引数の変数名は誤解のない範囲で省略できる。

問4 orderでソート項目は並べればよい。

問5 特にない

問6 これだけで科目ごとの箱髭図を書いてくれるなんて、なんて便利なんだろう。

問7 組ごとの箱髭図はこう指定する。問6との違いは、先に述べたように、科目は横に展開し、組は縦に展開していること。

問8 特にない

問9 特にない

問10 d[3:5]がデータフレームなので、sapplyはリストの要素の各ベクトルすなわち各列に対して動作する。

問11 問10との違いは、前述のとおり

問12 applyの中でtapplyを使ってみた。うまくいった。sapplyでもいいのだね。

問13 いろいろと試行錯誤し、もっともよさげなものをあげた。

問14~17 抽出

問17 抽出と整列を同時にできないかというチャレンジ。一時変数を使わないでやりたかったが、最終的には用いてしまった。敗北感あり。使わない版もいくつか作ったが、同じ計算を2度やらせていて、許せない。いつの日か思いつくかもしれない。

問18 科目別のベストテンなどの表はよく作るだろう。それである。文字列ベクトルを作っておいて、その並び順を添え字で指定するというこのパターンは初めての経験かもしれない。

問19 breaksについては問20参照

問20 科目別度数分布表。苦労したのは、区間の指定。たとえば、breaks=c(10,20,30,40)とすると、この4つの数値によって、3つの区間に分けられる。10≦x≦20,20<x≦30,30<x≦40。最初の10の不等号に=が入っている

サンプルデータでは、回帰係数や回帰分析や、主成分分析、クラスタ分析も面白くなかろうと思ってやめた。

0 件のコメント:

コメントを投稿