データはこんな風です。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 件のコメント:
コメントを投稿