データファイルの読み込みと書き出し

Rを使って、収集したデータ項目をいちいち入力して表データを作成するようなことは稀である(不可能ではないにせよ無用な手間がかかる。Rの本領はそんなところにはない)。 Excelなどの表計算ソフトウエアなどで表データにまとめられたデータセットをRに読み込む場合がほとんどである(Rを使って表データとして書き出すことはしばしばある)。 Rなどの汎用のプログラム処理では、CSV形式〜機械可読性を配慮したデータ公開で指摘したように、テキスト形式によるデータファイルを用意してこれを読み込むようにするのが望ましい。

テキスト形式によるデータセットにおいて、表データとして各レコードにおけるフィールドの区切り記号をカンマ (,) としたデータ書式をCSV形式(Comma-Separated Values)という。 CSV形式はRFC4180で標準化されており、大変しばしば利用される重要なファイル形式である。 ここでは主に、表テキストは主にCSV形式で取り扱うことにする。

他にのテキスト形式による表データとして、半角空白文字を区切り文字としたSSV形式(Space-Separated Values) やタブ文字(\t)を区切り文字としたTSV形式(Tab-Separated Values)があり、これらは用途に応じて使い分ける(Rにおいても、レコードの読み込みにおいてフィールド区切り記号を設定する)。

CSV形式ではデータ区切りはカンマ (,) であるが、常にこの形式がベストであるわけではない。 たとえば、数字や金額の表記において桁区切りを「カンマ」としているデータ項目が並んだ表を扱う場合が少なくないので注意が必要だ。 実際、ドイツでは桁区切りにカンマを多用するので、データ区切りをセミコロン (;) として扱う場合がある。

Rでは、テキストファイルを読み込む際に、データ区切り記号を明示的に指定するオプション sepが用意されているので、面倒でもこのオプションを利用するのが賢明である。 たとえば、タブ区切りの場合には sep="\t"、空白なら sep=" " と指定する。

問題 R-readwrite1: Excelで作成したデータファイルseiseki.xlsをCSV形式にして保存せよ。 一般に、Excelのような専用アプリケーションで作成したファイルをテキストファイルに変換する際、注意すべき諸点を上げよ。
問題 R-readwrite2: 生成したCSV形式データファイルseiseki.xlsをテキストエディタで開いて観察してみよ。 併せて文字コードも確認せよ。 場合によっては、文字コード(と改行コード)を変換する必要がある。 たとえばUTF-8 <-> ShiftJISの文字コード変換をエディタを使って行うにはどうすればよいか。
問題 R-readwrite3: Excelは便利である。 しかし、Rはさらに便利で強力である。 Rを使い慣れてくるようになると、Excelから原理的にはCSV形式に変換でき得るとしても、Excel表組みの段階で注意しておくべき諸点があることが分かってくる。 それらを列挙して、その理由を説明せよ。

作業場所の確認とファイルパス

Rはひとたび起動すると、あらかじめ設定された作業場所を持つ。 これをWorking Directory(作業ディレクトリ)という(以下、ディレクトリをフォルダ)ということばで置き換えてもよい)。 作業ディレクトリを取得する関数はgetwd( )(Get Working Directory)である。 明治のWindows環境でRを起動したときには、次のように z: ドライブのroot に設定されている。

> getwd( )
"Z:/"

このように、RではWindows/MacOSともに、ファイルの在り処を指定するための目的ファイルへのファイルパスの表示にはディレクトリ区切り記号としてslash (/) が使われる。 たとえば、つぎのように

"z:/.windows200/R/2013-population.csv"

ドキュメントフォルダの場所

実習室のWindows環境においてユーザに割り当てられた「ドキュメント」フォルダの場所は

z:/.windows200
である。 この「ドキュメント」フォルダに作業ディレクトリを変更することができるが、WindowsのRに入力する際のファイルパスのディレクトリ区切り記号はbacksla(\)であることがややこしい。

RStudioを使う場合、[Tools]/[Global Option]のDefault working directoryを Z:/.windows2000 と設定しておくとよい。

作業ディレクトリの変更

指定した作業ディレクトリdirに移動するには関数 setwd(dir) を使う。 このとき、WindowsもMacOSでも、移動先作業ディレクトリ dir の指定には二重引用符 " で囲まねばならない。 もちろん、そのディレクトリが存在しなければならない。

Windowsでの作業ディレクトリ異動

ユーザ割り当ての「ドキュメント」フォルダ内のフォルダ R(z:/.windows2000 [Windows的には z:\\.windows2000] に 割り当てられている) に作業ディレクトリを移動するには次のようにする

> setwd("z:/.windows2000/R")

MacOSでの作業ディレクトリ異動

MacOS(やLinuxなどのunix系OS)の場合には、Rに入力するディレクトリ区切り記号は、Rが表示する区切り記号と同じslash (/) を使う。 ホームにあるフォルダDocuments内のフォルダR( ~/Document/R に作業フォルダを変更するには次のようにする。 二重引用符を忘れるとエラーになる。

> setwd("Documents/R")
> getwd( )
[1] "/Users/meiji/Documents/R"
作業ディレクトリの異動には、現在の場所(getwd() で取得できる)からの相対ファイルパス指定でも絶対パス指定のいずれかによって目的ディレクトリを指定すればよい。

問題 R-readwrite4: WindowsまたはMacOSでRを起動して、デフォルトの作業ディレクトリを取得せよ。 デフォルト作業ディレクトリを変更するにはどうすればよいか。
問題 R-readwrite5: Windows作業ディレクトリが、Z:/であるとき、作業ディレクトリをユーザ割り当ての「ドキュメント」内のフォルダ workにあるフォルダ R に移動するにはどうすればよいか。

作業ディレクトリ内のファイルの一覧

作業ディレクトリ内にあるファイルやディレクトリの一覧結果を返す関数 list.files() を知っておくとよい。

> list.files()
 [1] "$RECYCLE.BIN"                  
 [2] "AppData"                       
....
....            
[20] "seiseki.csv"                       

CSVデータ表を読み込む

以降では、目的のファイルが設定した作業ディレクトリにあるとして説明する。

上の問題R-read1で保存した、CSVデータ表ファイル seiseki.csv にRにデータフレームとして読み込んで変数 Seiseki に代入するには、関数 read.tablecode>( ) を使って(ドット (.) があることに注意)、次のように書く。

> Seiseki <- read.table("seiseki.csv", sep=",", header=TRUE, skip=8)

sep="," は、読み込むレコードデータにおけるデータ区切りがカンマであることを指定している。 header=TRUE は、表データのレコードにラベル名がある場合にはそれを使うという意である。 skip=8 は、Rに読み込むレコードデータが何行目から始まるかを指定つまり、ファイル先頭行から読み飛ばす行数を指定している。 今の場合、先頭から8行を読み飛ばして、レコードにラベル名が書かれた9行目からRに読み込むということである。

読み込んだデータやRで作成したデータセットは、その直後に読み込んだデータ構造(sructure)を関数 str( ) を使って確認することを習慣付けよう。

> str(Seiseki)
'data.frame':	200 obs. of  6 variables:
 $ Stnum: Factor w/ 200 levels "a111","a112",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Sex  : int  0 1 0 1 1 1 1 0 0 0 ...
 $ Eng  : int  68 38 51 62 82 44 48 47 77 89 ...
 $ Lang : int  76 62 62 77 69 72 72 64 77 58 ...
 $ Math : int  71 33 88 52 93 57 66 57 55 25 ...
 $ Ave  : logi  NA NA NA NA NA NA ...

変数 Seiseki に代入されたデータ構造は、データフレームであって、6つの変数(ラベル名 Stnum, Sex, Eng, Lang, Math, Aveに対応)からなる200オブジェクト(200行、つまり200人分)からなっていることがわかる。 NA は欠損値(Not Available)、つまり空白データである(科目の個人平均はまだ空白のままだ)。 Rでは空白データが混じっていても柔軟な対応ができることが後でわかる。

読み込んだデータフレームの内容を実際に表示するには、その変名数を入力すればよい。 次のようにすると、ヘッダ(ラベル名)に加えて200オブジェクト(つまり201行!)が表示される。

ここで注目すべきは、左端である。 ヘッダ情報以外のオブジェクトデータ毎に1からの通し番号がふられていることに注意する(最後は200になっている)。 このような左端に表示される番号はRに特徴的で、次のようにファイルとして書き出す場合にも付属する

> Seiseki
    Stnum Sex Eng Lang Math Ave
1    a111   0  68   76   71  NA
2    a112   1  38   62   33  NA
3    a113   0  51   62   88  NA
4    a114   1  62   77   52  NA
5    a115   1  82   69   93  NA
....
問題 R-readwrite6: 以上のことを実際にRで確かめよ。

Rデータをファイルに書き出す

Rで処理したデータフレームをファイルに書き出すには関数 write.table()を使う (ドット (.) があることに注意)。 以下では、データフレーム Seiseki を作業ディレクトリ内のファイル seiseki_result.csv として、データ区切りをカンマ「,」とするCSV形式で書き出している。 作業ディレクトリは適切に設定されていなければならない。

> write.table(Seiseki, file="eiseki_result.csv", sep=",")

書きだしたファイル seiseki_result.csv の中身はエディタで確認することができる。

問題 R-readwrite7

ファイル seiseki_result.csv の中身を注意深く観察せよ。 1行目の6つのラベル名は二重引用符で囲まれていること、 2行目以降の各データオブジェクト(レコード)は、1列目に通し番号(2重引用符 (") で囲まれている文字列であって「数」ではない)が加わって、1レコードは7つのフィールドからなっていることがわかる。

"Stnum","Sex","Eng","Lang","Math","Ave"
"1","a111",0,68,76,71,NA
"2","a112",1,38,62,33,NA
"3","a113",0,51,62,88,NA
"4","a114",1,62,77,52,NA
"5","a115",1,82,69,93,NA
...
問題 R-readwrite8

書きだしたファイル seiseki_result.csv をExcelで開いてみよ。 ラベル名とその下の各オブジェクトのデータ値との対応がズレていることを確認せよ。 その理由を説明しなさい。

その結果、Rで処理した結果をExcelなどのアプリケーションで再活用するには、左端の通し番号を削除することが必要になる。 実際に、「不要な」通り番号を削除してみなさい。