40. ファイルからデータを読み込む


テキストファイルに入っているデータを,データフレームとして R に読み込む方法を紹介する.たたき台のデータとして,ある 5 人の健康診断データを紹介する.内容は性別(sex : F→女,M→男),身長(height),体重(weight)のデータである.

sex(性別)

height(身長)

weight(体重)

F

158

51

F

162

55

M

177

72

M

173

57

M

166

64

作業ディレクトリの変更

データを扱う際,まず,データがあるディレクトリ(フォルダ)に作業ディレクトリを変更する必要がある.作業ディレクトリの変更方法は こちら を参照されたい.

データフレームの作成(テキストファイルから)

以下に出てくるデータは全て作業ディレクトリにあるものとする.もし,データが作業ディレクトリに無い場合は,ファイルを指定する場所にファイルのパスを指定すればよい(例:x <- read.table("C:/data.txt") ).

data01.txt のようなデータは,関数 read.table() で読む.データファイルに列名が無いので,R が勝手に列名を決めている.

 
 ( x <- read.table("data01.txt") )

  V1  V2 V3
1  F 158 51
2  F 162 55
3  M 177 72
4  M 173 57
5  M 166 64

 data01.txt

 
  F    158     51
  F    162     55
  M    177     72
  M    173     57
  M    166     64

data02.txt のように,1行目にコメントが入っているデータは,関数 read.table() の引数 skip(何行読み飛ばすか)に 1 を指定する.

 
 ( x <- read.table("data02.txt", skip=1) )

  V1  V2 V3
1  F 158 51
2  F 162 55
3  M 177 72
4  M 173 57
5  M 166 64

 data02.txt

 
### data02.txt ###
  F    158     51
  F    162     55
  M    177     72
  M    173     57
  M    166     64

data03.txt のように,1行目に列名が入っているデータは,関数 read.table() の引数 header(列名があるか否か)に T を指定する.

 
 ( x <- read.table("data03.txt", header=T) )

  sex height weight
1   F    158     51
2   F    162     55
3   M    177     72
4   M    173     57
5   M    166     64

 data03.txt

 
sex height weight
  F    158     51
  F    162     55
  M    177     72
  M    173     57
  M    166     64

data04.txt のように,1行目にコメント,2行目に列名が入っているデータは,引数 header に T を,skip(何行読み飛ばすか)に 1 を指定する.

 
 ( x <- read.table("data04.txt", header=T, skip=1) )

  sex height weight
1   F    158     51
2   F    162     55
3   M    177     72
4   M    173     57
5   M    166     64

 data04.txt

 
### data04.txt ###
sex height weight
  F    158     51
  F    162     55
  M    177     72
  M    173     57
  M    166     64

data05.txt のように,データ間がコンマ( ,)で区切られている場合は,引数 sep(データの区切り文字)に "," を指定する.また,タブで区切られている場合は "\t" を指定すればよい.

 
 ( x <- read.table("data05.txt", header=T, sep=",") )

  sex height weight
1   F    158     51
2   F    162     55
3   M    177     72
4   M    173     57
5   M    166     64

 data05.txt

 
sex,height,weight
F,158,51
F,162,55
M,177,72
M,173,57
M,166,64

関数 read.table() の引数を以下に示す.例えば,row.names と col.names にそれぞれ行名と列名を示す文字型ベクトルを指定することができる.

引数

機能

sep = ""

データとデータの区切り文字を指定する.

skip = 0

最初の行 から読み飛ばす行数を指定する.指定しない場合はファイルの 1 行目から読む.

nrows = -1

何行目まで読むかを指定する .指定しない場合(負の値の場合)はファイルの終わりまで読む).

header = F

「1行目は列名が書かれている」か否かを指定する.列名が書かれている場合で,F を指定すると不具合が生じる.

comment.char

コメント行を表す記号(デフォルトは \# )を指定する.

row.names=NULL

1 から始まる番号が行名として生成される.

row.names="列名"

指定した列のデータが行名として使われる.使われた列はデータフレームの変量としては取り除かれることになる.

row.names=列番号

上記と同じ.

row.names=文字型ベクトル

ベクトルの各要素が行名となる.ただし行数と同じ長さのベクトルを指定する.

関数 rownames(データフレーム名) と colnames(データフレーム名) で,それぞれ行ラベル,列ラベルを取り出すことも出来る.

また,read.table() のラッパークラスとして以下のような関数が用意されている.

関数

header

sep

quote

dec

用途

read.csv("ファイル名")

T

","

"\""

"."

区切りがコンマの場合

read.csv2("ファイル名")

T

";"

"\""

","

区切りがコロン&小数点がコンマの場合

read.delim("ファイル名")

T

"\t"

"\""

"."

区切りがタブの場合

read.delim2("ファイル名")

T

"\t"

"\""

","

区切りがタブ&小数点がコンマの場合

read.fwf("ファイル名")

F

"\t"

"\""

"."

一行の各欄の桁数 widths を指定して読み込む

例えば data05.txt は関数 read.csv() を用いて読み込むことが出来る.

 
 ( x <- read.csv("data05.txt") )

  sex height weight
1   F    158     51
2   F    162     55
3   M    177     72
4   M    173     57
5   M    166     64 

 data05.txt

 
sex,height,weight
F,158,51
F,162,55
M,177,72
M,173,57
M,166,64

Windows ユーザーの方は,フォルダの中の『フォルダオプション』から『拡張子を表示しない』のチェックを外した方が良い.チェックを外したくない方はテキストファイルを開いて data という名前で保存する.

Windows 版 R では,"C:/data.txt" を "C:\data.txt" とするとエラーが出るので注意.どうしても \ を使いたい場合は \\ で \ を表すことが出来る.

R ではオクタル表記や改行等の特殊文字を表現する為のエスケープ文字として 0x5c が使われます.たまたま win が C:\hoge と一般に表記するため,C:\\hoge 等と書かねばならないだけです。幸いな事に C 言語の POSIX 準拠のおかげで,/ をディレクトリの識別文字として扱えるので c:/hoge でもアクセスできます.\ を表すには \\ とするしか無いのですが、今後国際化の過程で \ → 0xA5(UTF-8) とかアレゲな事になるかもしれません.MS-CP932 , SHIFT_JIS 等からコード変換でもよく過去に話題になりました.(なかまさんより)