データファイルの読み込みと書き出し
Rを使って収集したデータ項目をいちいち入力して表データを作成するようなことは稀である(不可能ではないにせよ無用な手間がかかる。Rの本領はそんなところにはない)。 Excelなどの表計算ソフトウエアなどで表データにまとめられたデータセットをRに読み込む場合がほとんどである。
Rなどの汎用のプログラム処理には、機械可読性を配慮したデータ公開で指摘したように、テキスト形式によるデータファイルを用意してこれをRに読み込ませるようにするのが望ましい。
テキスト形式によるデータセットにおいて、各データ(フィールド項目)の区切りをカンマ『,
』とした形式をCSV形式(Comma-Separated Values)という。
他にも、半角空白文字を区切り文字としたSSV形式(Space-Separated Values) やタブ文字(\t
)を区切り文字としたTSV形式(Tab-Separated Values)がある。
CSV形式はRFC4180で標準化された仕様となっており、重要なファイル形式である。
ここでは主に、表テキストは主にCSV形式で取り扱うことにする。
CSV形式ではデータ区切りは『カンマ問題 R-readwrite1,
』であるが、常にこの形式がベストであるわけではない。 たとえば、数字や金額の表記において桁区切りを「カンマ」としているデータ項目が並んだ表を扱う場合が少なくないので注意が必要だ。 実際、ドイツでは桁区切りにカンマを多用するので、データ区切りを『セミコロン;
』として扱う場合がある。Rでは、テキストファイルを読み込む際に、データ区切りがなんであるかを明示的に指定するオプション
sep
が用意されているので、面倒でもこのオプションを利用するのが賢明である。 たとえば、コンマ区切りの場合にはsep=","
というように。
作業場所の確認
Rはひとたび起動すると、あらかじめ設定された作業場所を持つ。 これをWorking Directory(作業ディレクトリ)という。 作業ディレクトリを取得する関数はgetwd( )
(Get Working Directory)である。
Windows環境でRを起動したときには、たとえば次のようになる。
> getwd( ) "Z:/"RではWindows/MacOSともに、ファイルの在り処を指定するために、そのパス指定に区切り記号『/』を使う。 たとえば、ZドライブのフォルダRの中のフォルダ meiji の場所を指定するには
Z:/R/meiji
と書く。
問題 R-readwrite4
問題 R-readwrite5
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( )
読み込んだデータやRで作成したデータセットは、その直後にそのデータ構造(sructure)をすかさず確認するように習慣付けておくべきである。
そのための関数が
読み込んだデータフレームの内容を表示するには、その変数を入力すればよい。
次のように、ヘッダ(ラベル名)に加えて200オブジェクト(つまり201行!)が表示される。
注目すべきは、左端である。
ヘッダ情報以外のオブジェクトデータ毎に1からの通し番号がふられていることに注意する(最後は200になっている)。
この左端の通し番号は、Rからファイルとして書き出す場合にも付属することを知っておくべきである。
Rで処理したデータフレームをファイルに書き出すには関数
書きだしたファイル を使って(カンマ「.」があることに注意)、次のように書く。
> Seiseki <- read.table("Z:/R/seiseki.csv", sep=",", header=TRUE, skip=8)
sep=","
は読み込むデータセットのデータ区切りがカンマであることを指定している。
header=TRUE
は表データのラベル名がある場合にはそれを使うという意である。
skip=8
はRに読み込むデータが何行目からかを指定つまり、ファイル先頭からの読み飛ばし行を指定している。
今の場合、先頭から8行は読み飛ばし、ラベル名のある9行目からRに読み込むということである。
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では空白データが混じっていても柔軟な対応ができることが後でわかる。
> 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データをファイルに書き出す
write.table( )
(ピリオド「.」があることに注意)を使う。
以下では、データフレーム Seiseki をフォルダZ:/R内にファイル名 seiseki_result.csv
として、データ区切りをカンマ「,」とするCSV形式で書き出している。
> write.table(Seiseki, file="Z:/R/seiseki_result.csv", sep=",")
seiseki_result.csv
の中身はエディタで確認することができる。
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などのアプリケーションで再活用するには、左端の通し番号を削除することが必要になる。
実際に、「不要な」通り番号を削除せよ。