R言語
出典: フリー百科事典『ウィキペディア(Wikipedia)』
R言語(アールげんご)は、オープンソースでフリーソフトの統計解析向けプログラミング言語である。
R言語は、ニュージーランドのAuckland大学のRoss IhakaとRobert Gentlemanにより作られた。現在では、R Development Core Teamによって、メンテナンスと拡張がなされている。
目次 |
[編集] 特徴
R言語は文法的には、統計解析部分はAT&Tベル研究所が開発したS言語を参考としており、またデータ処理部分はSchemeの影響を受けている。
R言語は、統計計算に特化した言語である。ベクトル、配列、行列、データフレーム、リストなど、統計計算の上で必要となる、数多くのデータをまとめるデータ型が最初から実装されている。複素数計算も最初から実装されている。
R言語は、単なるプログラミング言語である以上に、統計計算を行える環境であることが重視されており、充実した統計関数を備え、統計で必要となるグラフ、図の描画についても充実した機能を備えている。更に、世界中のユーザが開発したプログラムがCRANによりパッケージとして整理立ててまとめられ、表示されたパッケージを選ぶだけでそれらをインストールして使用することができる。aptに近い仕組みになっている。
R言語は、インタープリタ型言語であるが、高速な計算を可能にするために、C、C++、FORTRANなどで書かれた外部プログラムと動的リンクさせ、拡張することが可能になっている。
R言語は、フリーソフトウェアであり、オープンソースである。フリーソフトウェアであるため、大学などで統計学を教える時など、講義の上で利用されることが最近増えてきている。
[編集] 言語仕様
R言語の構成には広義の関数型言語の一つであるSchemeの影響があり、リストを基本にした内部処理、遅延評価、静的スコープなどの特徴を持つ。表記法にはCの影響がある。ここでは、Rの特徴的な仕様について、ごく簡単に触れる。詳細はR Language Definition (日本語)を参照されたい。以下引用符は一重でも二重でもよい。
[編集] 制御構造、サブルーチン
for, if, while, repeat, swicth, break といった近代的な構造化構文をサポートする。自前の関数(手続き)を定義することができ、自前の二項演算子を定義することもできる。関数はfunction関数で生成する。次に階乗を計算する自前の関数を生成し、toyfactorial として参照可能にする例を示す。
toyfactorial <- function (n) { if (n <= 0) return(NA) f <- function(i) { if (i == 1) return(1) else return(i * Recall(i - 1))} return(f(n))}
これは実用的ではないが、関数のネスト、再帰呼び出し、スコープの例として挙げる。RはPascalやModula-2のように関数のネストが可能である。この例では関数内部で更に局所的な関数を生成し、fとして参照している。スコープもPascal等と同様辞書式で関数 f の中ではその外側にある toyfactorial の変数が「見える」。str は局所変数なので、関数の外側に同じ名前の変数があっても影響を与えない。ただし、Rは呼び出しスタックを遡る動的スコープも実現可能である。f の内部では自分の名前を参照することができないので、自分自身を再帰的に呼び出すためにRecall 関数を用いている。関数型の引数を利用することもでき、その場合複数の関数が互いに呼び出しあうことができ、また無名の関数をその場で定義して関数型の引数として渡すことができる。一種の複文のような用途に用いられる。NAは統計処理においては欠くことのできない特殊なデータで、データが無効であることを示す。
Rの関数はそれ自体がオブジェクトであり、ある関数自体を外から参照したり書き換えたりすることができる。関数の本体部分を返す body 関数、仮引数リストを返す formals 関数、関数に付随する環境を返す environment 関数などが用意されている。
渡された式そのものを操作することも可能で、特定の環境(名前とポインタのリスト)の下で与えられた式を評価する eval 関数、渡された式の要素を環境に応じて置き換える substitute 関数、式を文字列に分解する deparse 関数等がある。
関数呼び出しも一種のリストとして処理されており、次のようにcall 関数を用いて、関数名と引数のリストから関数呼び出しオブジェクトを生成することができる。
x <- 1:3 y <- 2:4 z <- call('plot', x, y) eval(z)
関数はファイルから読み込むこともでき、更には「パッケージ」(ライブラリ)として一まとまりにすることもできる。
[編集] オブジェクト指向
Rには継承やメソッドの実行時ディスパッチといったオブジェクト指向プログラミングの手法が取り入られており、数多くの総称的な (generic) 関数を持つ。これは同じ関数名であっても、取り扱うオブジェクトが属しているクラスによって独自の方法で処理を行うものである。Rでは、クラスはオブジェクトに付随する属性として扱われるものの一つであり、リストとして保管されている。
[編集] データ型
数値型(複素数を含む)、文字型、論理型といった基本的な型、ベクトル、リスト、行列といった統計処理や情報処理に必要な型を備えている。前述のように関数それ自体もデータである。データフレームは配列ないしリストの拡張版で、コラム毎に異なったデータ型を持つことができるため、表の形で表現されたデータを格納/操作するのに有用である。データフレームは行列から生成することもあるが、ここでは岡田昌史他『The R Book』(ISBN 4901676970) に倣ってリストとの関連で説明する。
[編集] ベクトルとリスト
ベクトル型は、データをある順序で並べたものである。2:5 または c(2, 3, 4, 5) は数値型データ2, 3, 4, 5をこの順序で並べたものである。変数a, bを同じ要素数をもつ数値型データのベクトルとすると、a + bは両ベクトルを要素毎に加算してできた、同じ要素数の数値型ベクトルを返す。a + 1はベクトルaの各要素に1を加算したベクトルを返す。c('猫', '猫', '犬')のように文字(列)型、論理型データを要素とするベクトルを作ることもできる。
リスト型は、様々な型のデータを並べたものである。ベクトルのリストやリストのリストも可能である。list 関数によって生成することができる。
f1 <- c('猫','猫','犬') f2 <- c(1, 2, 3) f <- list(field1=f1, field2=f2)
文字型データを要素とするベクトル f1、数値型データを要素とするベクトル f2 から、リスト f が生成される。field1, field2 はリストの要素を指す「タグ」である。LISP風のdotted pair listも実装されているので必要に応じて用いることができる。
[編集] データフレーム
さて、上記の2つのベクトルf1, f2の要素数は等しい。このような場合、リストをデータフレームに変換することができる。
df <- data.frame(f, row.names=c('たま ', 'みけ', 'ぽち'))
dfはデータフレーム型変数であり、各ROW(以下「行」)に「たま」「みけ」「ぽち」のラベルがつく。
もうすこし大きな表、例えば
種 | 性別 | 月齢 | 愛らしさ | |
---|---|---|---|---|
たま | 猫 | ♀ | 1 | 5 |
しろ | 猫 | ♂ | 2 | 4 |
くろ | 猫 | ♂ | 1 | 5 |
みけ | 猫 | ♀ | 3 | 5 |
ぶち | 猫 | ♂ | 12 | 3 |
とら | 猫 | ♂ | 18 | 2 |
みゃぁ | 猫 | ♀ | 30 | 4 |
猫じゃ | 猫 | ♂ | 80 | 0 |
ぽち | 犬 | ♀ | 2 | 5 |
ころ | 犬 | ♀ | 10 | 5 |
たろ | 犬 | ♂ | 40 | 3 |
じろ | 犬 | ♂ | 40 | 3 |
じんぺい | 犬 | ♂ | 50 | 2 |
わん | 犬 | ♀ | 60 | 4 |
のらくろ | 犬 | ♂ | 100 | 5 |
を例えば「犬猫」という名前の変数にデータフレームとして付値(手続型言語の代入に相当する)すると、その内容は
> 犬猫 種 性別 月齢 愛らしさ たま 猫 ♀ 1 5 しろ 猫 ♂ 2 4 くろ 猫 ♂ 1 5 みけ 猫 ♀ 3 5 ぶち 猫 ♂ 12 3 とら 猫 ♂ 18 2 みゃぁ 猫 ♀ 30 4 猫じゃ 猫 ♂ 80 0 ぽち 犬 ♀ 2 5 ころ 犬 ♀ 10 5 たろ 犬 ♂ 40 3 じろ 犬 ♂ 40 3 じんぺい 犬 ♂ 50 2 わん 犬 ♀ 60 4 のらくろ 犬 ♂ 100 5
のように、本来のデータをよく表現するものとなっている。それだけでなく、「猫」「犬」「♀」「♂」などの文字データは内部的に因子ないしカテゴリに変換されている。データフレームから特定のデータコラムを抽出するには 変数名$タグ名、例えば 犬猫$月齢 とする。特定のデータ行だけを抽出するには subset 関数または要素の指定 [ ] を用いる。例えば
猫 <- subset(犬猫, 犬猫['種'] == '猫') 犬 <- 犬猫[犬猫['種'] == '犬',] t.test(猫$愛らしさ, 犬$愛らしさ)
は「愛らしさ」の平均値を猫と犬の間でt検定する(この例ではp-value = 0.6537)。
[編集] 機能
Rには標準状態でも統計、検定、解析向けの強力な関数が備わっており、必要に応じて新たな関数を定義することができ(CやFORTRANなどによって記述し、外部でコンパイルした関数を呼び出すこともできる)、自分でプログラムを書かなくても、多くのパッケージを利用することができる。これに加えて、便利な入出力機能、グラフ作成機能を備えている。
[編集] データ入出力
ベクトルを読み込む scan 関数、簡易にデータフレームを読み込むことのできる read.table 関数等、テキストファイル入出力用のさまざまな関数が用意されている。また、市販の統計解析パッケージSPSS、SAS等の独自形式バイナリデータを直接扱うこともできる。画像をバイナリデータとして読むこともでき、読み込み後は行列として扱うことができるので、画像処理にも用いうる。パイプやソケット(ポート番号参照)を扱う関数も用意されている。
[編集] データのプロット
plot 関数によって多彩なプロットができる。plotは総称的な関数であり、引数として渡されたデータの種類によって、自動的に様々なグラフを描き分ける。他にヒストグラムを描画する関数、イメジを描画する関数など高レベルの描画関数がある。これらはデフォルトでも機能するが、細かなパラメタを指定することもできる。加えて、単に線を引いたり点を打ったりする低レベルの描画関数も用意されているため、好みのグラフを生成することができる。プロットは画面に対して行われるだけでなく、PDF、PS、PNGといった形式の出力を直接行うこともできる。
図に、デフォルトでのプロット例を示す。上から順にplot(犬猫$種, 犬猫$性別)、plot(sin(seq(0, 2 * pi, 0.1)))、image(x <- -50:50, x, x %*% t(x))の実行結果である。seq関数は等差級数からなるベクトルを生成する。%*%は行列の積を計算する演算子、tは転置行列を生成する関数である。最初の例では先に扱った動物種毎の性比を表示、次の例では正弦関数(自動的にベクトルの添字が横軸となり、ベクトル生成式が縦軸のラベルとなっている)を表示し、最後の例では、引数を評価する中でベクトルを生成してxに代入し、積を計算し、その各要素の値を色の濃さで表現している。
[編集] ワークスペースの保存
現在の作業状況に名前を付けて保存し、後に再利用することができる。コマンドを発行するコンソールの内容も保存できるので、どのような処理を行って結果を得たかを確実に記録し、再現することができる。発見的操作を伴う研究用途では極めて重要な要素である。
[編集] 外部リンク
- 公式ページ
- RjpWiki... http://www.okada.jp.org/RWiki/ 日本語でのRの情報が集まっている。