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

Rを使って収集したデータ項目をいちいち入力して表データを作成するようなことは稀である(不可能ではないにせよ無用な手間がかかる。Rの本領はそんなところにはない)。 Excelなどの表計算ソフトウエアなどで表データにまとめられたデータセットをRに読み込む場合がほとんどである。

Rなどの汎用のプログラム処理には、機械可読性を配慮したデータ公開で指摘したように、テキスト形式によるデータファイルを用意してこれをRに読み込ませるようにするのが望ましい。 テキスト形式によるデータセットにおいて、各データ(フィールド項目)の区切りをカンマ『,』とした形式をCSV形式(Comma-Separated Values)という。 他にも、半角空白文字を区切り文字としたSSV形式(Space-Separated Values) やタブ文字(\t)を区切り文字としたTSV形式(Tab-Separated Values)がある。 CSV形式はRFC4180で標準化された仕様となっており、重要なファイル形式である。 ここでは主に、表テキストは主にCSV形式で取り扱うことにする。

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

Rでは、テキストファイルを読み込む際に、データ区切りがなんであるかを明示的に指定するオプション sepが用意されているので、面倒でもこのオプションを利用するのが賢明である。 たとえば、コンマ区切りの場合には 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を起動したときには、たとえば次のようになる。
> getwd( )
"Z:/"
RではWindows/MacOSともに、ファイルの在り処を指定するために、そのパス指定に区切り記号『/』を使う。 たとえば、ZドライブのフォルダRの中のフォルダ meiji の場所を指定するには Z:/R/meiji と書く。

問題 R-readwrite4

WindowsまたはMacOSでRを起動して、デフォルトの作業ディレクトリを取得せよ。 デフォルト作業ディレクトリを変更するにはどうすればよいか。
Rで目的のファイルを指定するには、現在の作業場所からのファイルパスを指定する(のが普通である)。 もちろん、作業ディレクトリがどこにあっても絶対パス指定によってファイルを指定することができる。

問題 R-readwrite5

Windows作業ディレクトリが、Z:R/exam/2014であるとき、ファイル Z:R/analize/2014/classdata-a.csvを指定するためのファイルパスはどうなるか。

作業ディレクトリの変更

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

次の例は MacOSの場合である。 ホームが作業領域であることを確認し、ホーム直下にあるフォルダDesktop( ~/Desktop に作業フォルダを変更しようとしている。 二重引用符を忘れるとエラーになる。

> getwd( )
[1] "/Users/taro"
> setwd(Desktop)
以下にエラー setwd(Desktop) :  オブジェクト 'Desktop' がありません 
> setwd("Desktop")
> getwd( )
[1] "/Users/taro/Desktop"

CSVデータ表を読み込む

以降では、場所Z:にフォルダRを作成して、目的のファイルがZ:/Rにあるとして説明する。

上の問題R-read1で生成した、CSVデータ表ファイル seiseki.csv にRに読み込んで、データフレームとしてSeisekiとするには、関数 read.table( ) を使って(カンマ「.」があることに注意)、次のように書く。

> Seiseki <- read.table("Z:/R/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 をフォルダZ:/R内にファイル名 seiseki_result.csv として、データ区切りをカンマ「,」とするCSV形式で書き出している。

> write.table(Seiseki, file="Z:/R/seiseki_result.csv", sep=",")

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

問題 R-readwrite7 ファイル seiseki_result.csv の中身を注意深く観察せよ。 1行目のラベル名は二重引用符で囲まれていること、 2行目以降の各データオブジェクトは、通し番号(文字列であって数ではない)が加わって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などのアプリケーションで再活用するには、左端の通し番号を削除することが必要になる。 実際に、「不要な」通り番号を削除せよ。