| Top Page | プログラミング | R 自動化 目次 | 索引 | 前へ | 次へ |

R でプログラミング:データの一括処理とグラフ描き

1. 準備一般

R をはじめる

R はフリーですので,だれでも無料でダウンロードして使うことができます. R の使い方の情報は,ネット上でも書籍でも,どんどん増えています. ひとつだけあげるとしたら,日本の R ユーザたちが育てている Wiki サイト, RjpWiki. 多量の情報が集積されています.

他の有用なページへの リンク集 も充実しています. R 初心者のかたは,ここの R習得段階別厳選リンク集にもあげられている, R-Tips (舟尾さん) からはじめるのがよいでしょう.

いままでまったく R の経験がないなら,R-Tips の基本知識篇だけでもながめてから こちらのページに戻ってきて,そのあとは適宜いったりきたり していただくとよいかと思います. また,以下のページのなかでも頻繁に「詳細は R-Tipsのこのページを」と,R-Tipsへの リンクを設定してあります. R-Tips は包括的な入門,こちらのページはプログラムを書いて 一括・自動処理をするために必要な知識に絞ったメモ,とご理解ください.

また,このページでは統計解析手法についてはほとんど触れていません. 統計手法のいろいろについては, 青木繁伸さんの Rによる統計処理 を眺めてみてください.

なお、以下では R のGUI実行環境である RGui を起動してプログラムを実行することを想定していますが、 たとえば Windows のコマンドプロンプトを立ち上げてそこで実行することもできますし (詳しくは14章参照)、 もっと手厚い実行サポート環境である Rstudio を起動してからプログラムを実行することもできます。 Rstudio についてはネット上でもいろいろな情報が手にはいります。 私がある機会に作成した Rstudio の簡単な使い方のプレゼン資料も公開します (>資料)。


作業ディレクトリ

R は,つねにひとつのディレクトリ(フォルダ)に注目しています. これを作業ディレクトリと呼ぶことにします. まとまったデータを解析するには,それらをまとめて入れておく専用ディレクトリを 用意しておきます .別の種類のデータファイルは,別のディレクトリに分けて整理しておくとよいでしょう.

R を起動(正確には、R のGUI実行環境である Rgui を起動)したら,解析したいデータが入っているディレクトリを作業ディレクトリにします. そのためには,R を起動したあと、 [ファイル] メニューから [ディレクトリの変更]を選んで,移動先のディレクトリを指定します。

この作業ディレクトリには,解析するデータファイルだけでなく,そのデータの処理につかう 自作プログラムファイルや,計算結果をしまうテキストファイル, 描画したグラフを記録する画像データファイルなどもまとめて入れることにしましょう.

なお、いろいろなデータの解析を行うときは、いくつかのディレクトリを作成し、 それぞれに分かりやすい名前をつけて、関連するデータやプログラムを整理してしまうとよいでしょう。 ひとつのディレクトリになにもかも詰め込むと、あとでなにがなんだか分からなくなります。

<練習>

作業するディレクトリに移動して,いろいろ試したところで, 「ファイル」メニューの「作業スペースの保存」を選択し, 保存先のディレクトリとして現在のディレクトリを選ぶ(最初からそこが表示されるはず) と,「.RData」 というファイルがディレクトリ内に作成されます. 次回以降,このディレクトリで作業をするときには,このファイル(のアイコン)をダブルクリック して R を起動すると,自動的にこのディレクトリが作業ディレクトリとなるはずです. 毎回起動してからディレクトリを移動するより簡単です。

データファイルの用意

この節では,どんな形式のデータファイルを用意したらよいかについて簡単に説明します. 実際にデータファイルを読み込んでの練習は次ページ以降に行います. ここは読み流すだけでけっこうです.

扱いやすいデータファイル形式

データはテキストファイルから読み込むのが基本です. テキストファイルとは、文字、数字などが並んでいるだけのファイルです。

表計算ソフトやワープロソフトなどのファイルは、テキストファイルではありません。 表計算ソフト(Excelなど) や ワープロソフト(Word など)が作るファイルは、 表示する文字のデータだけでなく、それをどのように表示するかというフォントや レイアウトの情報、貼り込まれた画像の 情報なども含みますし、文字自体、そのソフト特有の形式で記録されていたりします。 テキストファイルは、そうした情報をいっさい含まないファイルです。

各列がそれぞれひとつのデータ項目に対応し,各行はひとつのサンプルのデータという 形式のテキストファイルだと,関数(read.table)をひとつ呼び出すだけで読み込めます. データの区切りは空白かタブなら,特別な指定はいりません. また,カンマが区切りのファイル(CSV, comma separated values)なら,read.tableではなく read.csvという関数を使えば同じことができます.

ファイルの一行めには各列の内容を表すラベルを書いておくと分かりやすいでしょう. 項目名にはアルファベット,数字,ピリオド '.',下線 '_' が使えます. 最初の文字に数字は使えません.これは,あとで出てくる変数名や関数名のルールと 同じです. また,同じ名前が重複してもいけません.

こうしたルールに従わない名前を与えた場合,読み込み時に適当に名前を変形して ルールに従うものにしてくれます.でも,この機能に頼ってしまうと, 自分が与えたつもりの項目名と R のなかでの項目名とが一致せず, 混乱のもとです. なるべくルールにしたがった名前をつけておくのが無難でしょう.

以下は,read.table関数で読めるデータの例です.

Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
5.1         3.5          1.4         0.2     setosa
4.9         3.0          1.4         0.2     setosa
4.7         3.2          1.3         0.2     setosa
4.6         3.1          1.5         0.2     setosa
5.0         3.6          1.4         0.2     setosa
5.4         3.9          1.7         0.4     setosa
....

R では,練習用にいくつかデータが用意されています.上の例では, そのなかのアヤメの仲間の花の形態のデータ (iris) の一部を借用しました.

以降のページでは,基本的にこのような表形式のデータを,データフレームという データ構造(とはなにかはあとで説明します)に読み込んだものを処理するという 状況を想定しています.

なお,read.table 関数で読み込むには,各列のデータ数は同じでないといけません. このデータ構造は,列が測定項目,行がひとつのサンプルに相当するというような構造を 想定しています.100個体について,毎月1回,12ケ月にわたって何かを測定した場合は, 行が個体,列は測定月に対応し,当然,すべての列は同じ数のデータを含みます.

いっぽう,各列が測定年月で,一列には,毎回野外でとってきた不特定数(50だったり 100だったり)のサンプルの測定データが並んでいるような場合には,データ数は不揃いになります. この場合,そもそも一行に並んだいくつかのデータが特別の結びつきを持つわけではありませんし, むりにひとつの表形式に並べないで,月ごとに別ファイルにしたほうが扱いやすいかもしれません (で,いくつにも分けたファイルをどうやって一括処理するかが, この文書の重要なテーマのひとつです).

とはいっても,やはり不揃いなデータ,一部の測定を失敗して抜けているデータを扱いたい ことはしばしばあるでしょう.そうしたデータの読み込みについては 次の章に説明があります.


表計算ソフトからテキスト保存

データの管理に表計算ソフト(たとえば MS Excel とか, OpenOffice.orgとか) を使っているかたも多いでしょう. それらのデータは,一度テキストファイルにしてから R に読み込んで使います. 表計算のシート上で,R で読み込みやすい上の例のようなかたちにデータを並べ, テキストファイルとして保存します.

また、Excel で作成したシートの必要な部分だけを選択・コピーし、あらかじめ開いておいた 空のテキストファイルに貼り付けると、列間がタブで区切られたテキストファイルを作ることができます。

※Excel の場合,ひとつのファイル中にたくさんのシートをまとめ管理できますが, これらをテキストファイルに保存するには,一枚一枚手で作業するしかなく,不便です. そこで,ファイル中のすべてのシートを一括してそれぞれテキストファイル保存する VBA プログラムを書きました( プログラムの紹介ページ). 役に立ちそうだったら使ってください.


テキストデータの整形

管理しているデータが,2次元の表のかたちになっていないなど, そのままの形では解析に適さないような場合もあります. まずは R のなかに一行ずつ読み込んでから整えるという手もありますが, テキスト処理が得意なプログラミング言語を使えるならば, それで前処理してしまったほうが簡単かもしれません.

Perl はそういう作業に(も)向いている言語ですし, Ruby も負けていません. もしこれらの言語を使えるなら,ぜひ活用を考えてみてください. もし適当な言語を知らないならば,後回しにして, とりあえずは手作業でかたちを整えましょう. せっかく R の勉強をする気になったのに, Perl や Ruby の勉強でエネルギーを使い果たしてしまっては困りますから.

※以前, Perl の入門講座 を書きました.ご参考まで.

プログラムファイルの編集と実行

R への命令は,キーボードから入力画面へ逐次入力することができますが, いくつもの命令をまとめてひとつのファイルに書き並べ,これらを一度に 実行させることもできます.これが R のブログラムです. お互いに無関係な命令を並べることもできますが,全体としてひとつのまとまった 作業をするように命令を組み合わせることができようになると,どんどん便利になります.

この節では,まず一行だけのプログラムを自分で書いて実行してみます.

エディタで編集

R のプログラムはテキストファイルに記録します. 使いなれたテキストエディタで編集します. Windows ユーザで,ふだんテキストエディタというものを使っていない人なら, さいしょは Windows付属のメモ帳でも OK です.

Windows のメモ帳はファイル名をつけて保存するとき,勝手に .txt という拡張子を つけようとします.これを避けるには,ファイル保存ダイアログボックスの ファイルの種類のところを,'テキスト文書(.txt)' ではなく 'すべてのファイル' を選択してから保存します.

R 環境のなかで専用エディタを立ち上げて,ここで プログラムを編集することもできます. メニューの[ファイル] → [新しいスクリプト] で, あたらしいプログラムを編集するウィンドウが開きます. ここに書込んだプログラムは,メニューの[編集] → [すべて実行] あるいは → [カーソル行または選択中のRコードを実行]で,実行することができます (※'スクリプト'や'コード'はプログラムと同義).

また、ここで作成したプログラムを[ファイル]→[別名で保存] (同名で上書きするときは →[保存])で、保存することができます。 すぐあとで説明するように、.R が付いた名前をつけて保存します。

※ファイル名の拡張子の表示(Windowsの場合)

Windows のエクスプローラ(ブラウザの IE でなく,コンピュータ内の ディレクトリはファイルの一覧を表示するほうの)では, ファイルの拡張子を表示する設定 にしておきましょう.ファイル名を指定して読み込んだり書き出したりするとき, 拡張子が見えていないと思わぬ混乱を招きます. (拡張子の表示方法: Windows Vista の場合 Windows XP の場合 Windows 7 の場合)。


定番:hello, world

どのプログラム言語でも,最初に実行してみるプログラムは 画面に hello, world と表示させるものと決っています (Wikipediaの解説).

R の入力画面で

cat('hello, world')

と入力してリターンキーを押すと,入力画面には

hello, world

と出力されます.cat は,そのあとのカッコで囲んだところに書込んだ 内容をそのまま出力するという機能を持った関数です. この場合,引用符で括った文字列 hello, wolrd が出力されています (文字列の説明)。

関数名のうしろのカッコ内に書かれたものは,一般に引数(ひきすう)と呼ばれ, 関数の内部での処理に使われます. 上の例では,引用符で括った文字列 hello, wolrd が引数です.

同じ命令を,プログラムファイル中に書き込んでから実行させてみます. まえに作製した練習用ディレクトリ内に,以下のような内容のテキストファイルを 作製します.

cat('hello, world')

ファイル名は任意ですが,このプログラムが hello という挨拶を出力することが 分かるように, hello.R としてみましょう.拡張子(ピリオドの後の部分)の R は, このファイルが R のプログラムファイルであることが一見して分かるように つけてあります.

R が注目する作業ディレクトリを,このプログラムファイルが置いてある 練習用ディレクトリに変更します(上の,作業ディレクトリの節を参照). その後,入力画面で

source('hello.R') 

と入力してリターンキーを押します.source も関数です.その機能は, カッコの中に書込んだ名前のファイルを探し,その内容を読み込んで, プログラムとして解釈して実行する,というものです. ここまでの作業がまちがいなくできていれば,入力画面に

hello, world

と表示されるはずです.

<練習>

プログラムファイルを作る意味

入力画面から一行づつ命令を書くかわりに,ファイルにプログラムを書いて, これを呼び出して作業すると,

といったメリットがあります.

試行錯誤しながらちょっとした作業をするだけならば,入力画面への入力だけで すませてよいでしょうが,何をしたかあとから見る必要がある(かもしれない)場合や, 試行錯誤の成果を自分で再利用したい(かもしれない)場合,さらには ほかの人にも利用してもらいたい場合には, プログラムファイルを作りましょう.

入力画面でいろいろためしたあとで,プログラムファイルに必要な部分を コピーしておくだけでもよいでしょう. ただし,ファイル中には,他人が見ても分かるように,じゅうぶんな説明を 書き込んでおきます.いまは分かっているつもりのことも,時間がたてば たちまち忘れます(1週間後の自分は他人). プログラム中への説明(コメント)の書きかたは,すぐあとに出てきます.

なお、プログラムを R のエディタ(Rエディタ)で作成する場合、 「全て実行」や [カーソル行または選択中のRコードを実行]で実行するよりも、 名前をつけて保存してからコンソール画面で source('...') で実行することをすすめます。 そのほうが、プログラム全体として文法的な誤りがないかをきちんとチェックしてもらえる からです(かっこの対応関係など)。 また、[…実行]方式の場合はエディタ画面のコードを一行ずつ コンソールにコピーしながら実行していくので、 プログラムが逐一表示されて画面がうるさくなります。

※表計算ソフトで手作業することのデメリットのひとつは,作業の記録を残しにくい ことです.間違った操作をしていないかあとからチェックできないし, 努力の成果の再利用もやりにくい.そもそもどういう操作をしたのかも 忘れてしまいがちです. R ではせっかく作業内容を残せるので,簡単な処理でもプログラムファイルに記録し、 どういう目的でなにをしているのかの説明もコメントとして書いておく 習慣をつけてましょう.


変数,関数

変数,変数名,変数の値

コンピュータは,内部のメモリにデータを記録して,いろいろな計算処理を行います. メモリには番地がついていますが,人間が番地そのものを使ってプログラムを書くのは 面倒です. ほとんどのプログラム言語では,メモリ中のデータがしまってある場所に 任意の名前をつけて, この名前を介してデータの読み書きができるようになっています. R も例外ではありません.

メモリに場所を確保して,名前をつけ,そこになにかの値を記録させたいとき,R では

変数名 <- 値

という書き方をします.不等号とハイフンを組み合わせた左向きの矢印で,右側の 値を左側の変数名が表すメモリーの場所にしまえ(代入せよ),という命令を表現します. 右側の「値」のところには,文字列 や数字をそのまま書いてもいいし, すでに存在している変数名を書いてもいいし(その場合,変数の値が左側の変数にしまわれる), 関数を書いてもいいし(その場合,関数が返す値がしまわれる), 演算式を書いてもいい(演算結果がしまわれる)のです.

R の変数名は,アルファベットで始まり,途中には数字,ピリオド '.',アンダーライン '_' を含むことができます(古い版の R では,アンダーラインは使えませんでした). 大文字と小文字は別のものとして扱われます.長さは好きなだけ.

さきほどの hello.R を,文字列をいちど変数に代入してから cat 関数に渡すように 書き換えたプログラム hello2.R を作ってみましょう.

x <- ('hello, world\n')   #  あいさつの文字列を変数 x に代入.
cat(x)                    #  変数 x を関数 cat に渡す.
x <- ('good by, world\n') #  別のあいさつを変数 x に代入.
cat(x)                    #  ふたたび変数 x を関数 cat に渡す.

あいさつの最後についている \n は,改行を指示する特殊文字です.

このプログラムを実行すると,明るいあいさつと悲しいあいさつが続けて表示されるはずです (ためしてみましょう).

プログラム中に # という文字があると,その行のなかの # からうしろの部分は プログラムとして解釈されません.処理内容についてのメモを書いておきたいときに 使います.


関数を自分で作る

R の関数は,さまざまな処理をひとまとめにして名前をつけ,あとから簡単に呼び出して 使えるようにしたものです.

すでに,catsource という関数が出てきました. R には,ほかにもたくさんの関数が用意されています. さまざまな統計計算だのグラフの描画だの,とても高機能な関数もあります.

数学の関数のイメージは,なにかの値をうけとって,それを もとになんらかの計算(たとえば1を足すとか二乗するとか)をした結果を返す というものです.R の関数は,これとはちょっと違います. R の関数を使うときにかならずしも値を渡さなくてもよいし, 関数は意味のある計算結果をかえさなくてもよいのです. 呼ばれたときに行われるさまざまな作業(たとえば画面に hello, world と 表示するような)がおもな機能という関数もたくだんあります. あとで出てくる,グラフを描くための関数はだいたいそのたぐいです.

R をインストールするとすぐに使える関数だけでなく,だれでも自分で関数を作って 使うことができます.一連の処理を書き,それに関数としての名前をつけてしまえば よいのです.このため,世界の R ユーザがよってたかっていろんな関数を作り, それを共有することで,R のパワーがますます増していきます.

R の関数を定義する(処理と名前を結びつけて,名前で処理を呼べるようにする)には, このように書きます.

関数名 <- function(もしあれば引数の名前)
{
    処理の内容
}

この書き方は,さきほど変数に値を代入したときと似ています. <- の前に名前(前は変数の,今度は関数の)を書き, <- のあとにはその名前で呼び出したい内容 (先程は変数の値,今度は関数の処理内容)を書いています.

さきほどの挨拶プログラムを関数として定義するには, プログラムファイルの内容を以下のように書き換えます(これを hello3.R という名前で 保存しましょう).

hello.goodby <- function()
{
    x <- ('hello, world\n')  #  あいさつの文字列を変数 x に代入.
    cat(x)                   #  変数 x を関数 cat に渡す.
    x <- ('good by, world\n')    #  別のあいさつを変数 x に代入.
    cat(x)                       #  ふたたび変数 x を関数 cat に渡す.
}

まず source('hello3.R') と入力してプログラムを読み込みます. この段階では,R に関数の処理内容と名前を教えただけなので,実行はされません. 続けて,hello.goodby() と入力してみましょう.関数が呼び出され, あいさつが表示されるはずです.

続いて引数を与える例も.

hello.to.you <- function(to.whom)
{
    cat('hello,', to.whom, '.\n')  # cat に表示させたいものは,いくつも並べて渡せる.
    cat('good by,', to.whom ,'.\n') 
}

関数名に使える文字は変数名と同じ,アルファベットで始まり,途中には数字,ピリオド '.', アンダーライン '_'を含むことができます.

hello4.R というファイルを作って上の内容を書込んで,source('hello4.R')で読み込みます. それから,たとえば以下のように,あいさつさせたい人の名前を 引数として渡して関数 hello.to.you を呼び出します. 引数として文字列を与えるときは,引用符で囲むことを忘れずに.

hello.to.you('TAMA-chan')

なお,R は,source 関数を使って読み込んだプログラムファイルが あとからエディタで編集されたかどうかを知ることはできません(当然ですが). プログラムファイルを編集したあとは,あらためてsourceで読み込み 直さないと,いつまでも最初に読み込んだものを覚えているだけです.

<練習>


上の関数の例で,{ と } で挟まれた関数の内容は,4文字分下げて(インデントして) 書かれています.文法上は不必要な字下げですが,人間が見て構造を把握しやすくするための 工夫です. このように書けば、ほかにもいろいろな処理が書かれたプログラムの中でも、 どこからどこまでがこの関数の定義か、はっきり見て取ることができます。

あとあとの一括処理のプログラミングのところでは,このような字下げが何重にも 入れ子になる例もでてきます. 繰り返しのfor 構文や while 構文、条件判断の if 構文など、 複雑な構造のあるプログラムほど, きちんと字下げして,その構造を見てとりやすくすることが必要になります. プログラムを読んで処理内容を理解するためだけでなく,まちがいを探したり, 改造して再利用したりするためにも,プログラムが見やすく書かれていることが重要です. めんどうかもしれませんが、 { と } で囲まれた中はインデントする習慣を最初につけてしまいましょう。


関数の名づけ

プログラムを書くときは,最初は関数のかたちにせずに ひとつのファイルに一連の処理内容を書いて, source('プログラムファイル名') だけで実行して動作を確認するのがよいでしょう

期待通りに動くようになったら,関数として定義して名前を付けます. 関連する自作関数がほかにもあるなら,まとめてひとつのファイルに 入れておくと管理しやすく便利です. ひとつのプログラムファイル中に,いくつも関数を書いておくことができます. 関数として定義すると,他のプログラムのなかからも呼び出せます.

関数の名前は,

に注意して決めます. すでに使われている名前かどうかを知るには,R の入力画面にその名前を 打ち込んでみます.うしろにカッコは付けません (カッコをつけると,関数を実行させることになります. 引数をなにも渡さない場合もカッコは必要). 存在する関数の名前を入力すると,その内容(プログラムコード)がさらさらと表示されます.

<練習>

表記の注意

ここまででとくに触れていない,プログラムの表記のルールをまとめておきます.

空白

変数名や関数名,2文字からなる演算子 (== とか <- とか)の途中をのぞいて, 任意のところに空白(半角スペース,タブ,改行)を入れることができます (全角スペースはダメ).

d<-read.table('foo.txt',header=T)

と書いても,

d <- read.table ( 'foo.txt', header = TRUE)

と書いても,さらに改行コードを挿入して

d <- read.table ( 'foo.txt', 
                  header = TRUE)

と書いても同じです. あとで見たときに読みやすい書き方のルールを自分で作っておくとよいでしょう.

ただし、改行コードの挿入に関しては注意が必要です。改行コードまでで ひとつの完結した文だと解釈可能な場合には、そのように解釈されていまします。

x <- 1 + 2  # x に 3 が代入される

y <- 1 +    # + で終わっているので、次の行も続きだと解釈し、
     2      # y には 1 + 2 の計算結果 3 が代入される

z <- 1      # この行だけで完結していると解釈可能なので、z に 1 が代入される。
    + 2     # x に影響せず、z は 1 のまま。

文字列

文字列とは、文字(アルファベットだの数字だの記号だの空白だの)が並んだデータです。 プログラム中に文字列を書込む場合、引用符で囲って示します。 二重引用符( " ) で囲っても一重引用符( ' )で囲っても同じです. ただし,一方の引用符ではじめた文字列は,同じ引用符で閉じないといけません.

'\':逆スラッシュ,または円記号

上のタイトルの最初,引用符にかこまれた文字は,どのように 表示されているでしょうか? 円(日本の通貨)の記号,Y に横線2本が表示されているかも知れませんし, 逆スラッシュ(左上から右下への斜線)が表示されているかも知れません. どちらの文字も同じ文字コードに対応していて,このページをご覧になっている 環境に依存してどちらかが表示されます. ブラウザ上では逆スラッシュが表示されていても,これをコピーしてエディタの 編集画面に貼りつけると円記号に変わるかもしれません.

いずれにせよ,日本語キーボードの円記号が書かれたキーを押したときに入力される 文字のことです.このページには逆スラッシュが書かれているけどそんなキーは ないぞ,と慌てず,円記号を入力してプログラムを書いてください.


| Top Page | プログラミング | R 自動化 目次 | 索引 | 前へ | 次へ |