<< トップページへ

<< 目次へ

最終更新日: 2010.8.15

データの入出力



◆ ディレクトリについて学ぶ

 Windowsユーザーというか、あまりコンピュータに慣れ親しんでいない人はディレクトリという概念が分かりにくいかもしれません。しかしファイル操作(データの入出力)において必要な知識なので覚えておきましょう。ディレクトリというのは、Windowsでいうフォルダのことです。Rにはワークディレクトリ(カレントディレクトリ)というものがあり、これは「現在作業を行っている場所」のことです。場所というのは当然ディレクトリ(フォルダ)のことです。まずはgetwd()を使ってワークディレクトリを確認してみましょう。

> getwd()
[1] "C:/Documents and Settings/katasho244/My Documents/R/workdir"

 上の実行例は私のワークディレクトリが表示されています。ダブルクォーテーションでくくられているのを絶対パスといいます。これの意味はCドライブにあるDocuments and Settingsというディレクトリ(フォルダ)、その中にあるkatasho244というディレクトリ、さらにその中にあるMy documentsというディレクトリ、My Documentsの中にあるR、Rの中にあるworkdir、という意味です。

 例えば私のworkdirというディレクトリにはpinaというディレクトリが存在しています。そこをワークディレクトリにしたい(移動したい)場合はsetwd()を使って以下のようにコマンドします。

> setwd("C:/Documents and Settings/katasho244/My Documents/R/workdir/pina")
> getwd()
[1] "C:/Documents and Settings/katasho244/My Documents/R/workdir/pina"

 しかし、1回1回このような長いコードを書く(絶対パスを指定する)のは骨が折れるといったところでしょう。そのために相対パスというものがあり、現在いるディレクトリ(カレントディレクトリ)を基点として移動したい場所を指定する方法があります。例えば、今はworkdirの直下にあるpinaというディレクトリにいるので、試しにもとのworkdirに戻ってみましょう。

> setwd("../")
> getwd()
[1] "C:/Documents and Settings/katasho244/My Documents/R/workdir"

 ここで用いた ../ は「カレントディレクトリから1つ上の階層のディレクトリに移動せよ」という命令をしているのです。また次のような使い方をすることもできます。

> setwd("./pina")
> getwd()
[1] "C:/Documents and Settings/katasho244/My Documents/R/workdir/pina"

 勘の良い人は気づいたかもしれませんが、カレントディレクトリ(移動の基点となる場所)を表すのが ./ という記号であり、 . (←実際には半角のコンマです)が「移動せよ」という命令を示す記号なのです。これで絶対パスを指定しなくても、相対パスを指定することでディレクトリを自在に移動できるようになりました。おまけとして、ルートディレクトリに移動する方法を以下に示しておきます。ルートディレクトリというのは一番元になるディレクトリのことで、WindowsではCドライブがルートディレクトリとなっています。

> setwd("/.")
> getwd()
[1] "C:/"
記号 意味
/. ルートディレクトリに移動
./*** カレントディレクトリから***に移動 ./***/+++とすれば***の直下にある+++へ移動する
../ カレントディレクトリから1つ上の階層にあるディレクトリへ移動


◆データの入出力

 ファイルには拡張子が伴い、例えば .txt で保存されたテキストファイルや .csv で保存されたCSVファイル、あるいは .xls で保存されたExcelワークシートなどがあります。なかでもテキストファイルにはタブ区切り、スペース区切りなどの区別がされます(なおCSVファイルはカンマ , で区切られたファイルのことです)。こうしたファイルを読み込むための方法はいくつかありますが、基本的にはread.table()の使い方を知っておけば十分でしょう。

> mydata <- read.table("***.txt", header=TRUE)  # 先頭行がラベルである場合はheader=TRUEとする

> mydata <- read.table("***.txt", header=FALSE) # 先頭行がラベルでない場合はheader=FALSEとする

 上記コードにおいて、***は任意のファイル名(読み込みたいファイル名)です。気をつけるべきことはファイル名だけを指定する場合、そのファイルがワークディレクトリに保存されていなければなりません。そうでない場合は絶対パスにて読み込むファイルを指定する必要があります。したがって、読み込むファイルはあらかじめワークディレクトリに保存しておくことをおススメします。

 例えばExcelワークシートに入力されているデータをテキストエディタにコピペ(コピー&ペースト)すると、それはタブ区切りとして貼り付けられます。そのまま .txt という拡張子で保存すればタブ区切りのテキストファイルとして保存されるということです。それを上記のようにread.table()で読み込めばmydataというオブジェクトにデータフレームとして読み込まれます。だから読み込むファイルの先頭行(1行目)にはラベルをつけておき、header=TRUEで読み込むと効率的でしょう。

 一方で出力として、そもそもオブジェクトの中身などはRのコンソール上(画面上)に出力(表示)されます。仮に大量の出力が得られるような場合にはRのコンソール上に出力させては見にくくて不都合が生じることもあります。あるいは2次的にその出力された結果をデータファイルとして流用するようなこともあるでしょう。そのようなときに手っ取り早く外部ファイルとして出力するためにsink()という関数があります。

> x <- rnorm(10)  # 10個の正規乱数を変数xに代入する
> x               # 中身を表示させる
 [1] -0.88527927 -0.46923701  0.04568748 -0.23269431 -0.13089199
 [6]  0.63718922  1.25021864  1.70679132  1.72614630  1.55721537
> sink("out.txt") # ワークディレクトリにout.txtというファイルとして出力させる
> x               # 中身を確認しようとしてもコンソール上には表示されず、out.txtに書き出される。
> sink()          # 元に戻す
> x
 [1] -0.88527927 -0.46923701  0.04568748 -0.23269431 -0.13089199
 [6]  0.63718922  1.25021864  1.70679132  1.72614630  1.55721537

 この他にも例えばwrite.table()といったファイル出力のための関数が用意されている。その詳細はヘルプを見ることで確認することができる。

> # ある関数のヘルプを見るためには ?*** とすればよい
> ?write.table   # write.table()のヘルプを見る