xiangze's sparse blog

機械学習、ベイズ統計、コンピュータビジョンと関連する数学について

「R言語徹底解説」をいただきました

R言語徹底解説」(原題 Adbanced R)を訳者の方からいただきました。ありがとうございます。
最初15章 DSLまで読もうとしましたが挫折したので3章 データ抽出について書きます。

R言語徹底解説

R言語徹底解説

Rはデータの統計的処理に特化したような言語ですが、この本ではデータ解析の対象や方法論や機械学習アルゴリズムではなく一般的なプログラミング言語としてのRの仕組みとに焦点が当てられています。著者のHadley Wickham氏がplyrパッケージやggplot2パッケージを作るにあたって勉強したことが書かれているようです。

R以外の本としては高階関数、スコープ、環境などの関数型的な要素は著者も紹介しているSICP(プログラミング言語の構造と設計)、デバッグやテストに関しては「プログラミング作法」が似たような本として挙げられます。個人的にはいきなり副作用が使えない言語を学んだりするよりは用途のはっきりした言語を使いながら学んでいった方が良いという意味で良いのかもしれないと思いました。

また第II部の最初で書かれているように直接Rはオブジェクト指向というよりは関数型かという印象を持ちました。これはifやforのような制御構文,functionも関数として実装されているという直接的な理由の他に、Rでやるようなプログラミングがデータの統計的処理を志向しているためデータフレームという特定のデータ構造を主に用い、それに対する処理(関数)の流れとその組み合わせに着目しているという点が有るかもしれないと思いました。
pythonと比較すると中置演算子%>%を多用するplyr(dplyr)はpandasのメソッドチェーンより分かりやすく、ggplot2パッケージの+演算子でつなげていく方法はmatplotlibより分かりやすいと思いました*1



3章 データ抽出ではデータフレームやリストからその一部分を抽出する方法が解説されています。他の言語ではSQLpythonのpandas、LINQにあるような機能です。

ここでRの分かりにくい点として[[演算子と[演算子の違いが有ります*2。データフレームdに対し

d[n]

ではデータフレームが返ってくるのに対し

d[[n]] または d$n

ではデータフレームの構成要素のデータ構造が返ってきます。[は構造保存形式、[[,$は簡易形式と呼ばれ、[で[[,$のような挙動をさせるにはd[n, drop = FALSE]とするそうです。
構造保存形式は他のプログラミング言語ではあまり見ない挙動です。普通は色々な型のデータの組み合わせで構成されたオブジェクトからその一部を抽出する場合はその構成要素の型の変数で返ってきます*3。行列やテンソルならばベクトルや行列などもとのデータより階数の低い変数が返ってきます。型を変えるときにはキャストします。

構造保存形式の方が簡単な書き方なのは個人的にはRの最も不可解な仕様でしたが、この本を読むことでその動作の理解を深めることが出来ました。
基本的にデータフレームの構造から出る必要がなくなり、データ抽出、検索のようなことをするのにとても便利です。

3章の残り3.4では構造保存形式を使ったデータ抽出として並べ替え、サンプリング、条件による抽出など機械学習でよく使うような処理が紹介されています。
列を削除する方法も書いてあり、ハマったことが有るのですが、-とかが使えるわけではなく面倒です。

参考

http://had.co.nz/

dichikaさんのひとりアドベントカレンダー

takeshi0406さんのRブログ
kiito.hatenablog.com
kiito.hatenablog.com

がとても勉強になります。

*1:というかpython演算子オーバーロードに制限があったりしてやりづらい方の言語に相当するようです。 http://kiito.hatenablog.com/entry/2016/02/03/003553

*2:すでにhttp://d.hatena.ne.jp/dichika/20151215/p1 で詳しく説明されています

*3:他のほとんどの言語では.を使うところをRでは$を使います。