R言語プログラミング: データ入出力
統計解析・データマイニング言語である R言語のデータの入出力をソースコードを用い紹介する。記載しているソースは、R Console上や EclipseでR-Scriptとして、そのまま実行可能である。
Rのインストール・環境設定はこちら
RをEclipseで実行するための方法はこちら
エディタによる入力と編集
データ入力、編集のための関数 edit, fix が用意され、表計算風のエディタで編集できる。edit では代入手続きをとらないと結果が保存されないが、fix では編集結果が直接保存される。
edit
関数 edit の使用法を示す。次のコードを実行すると以下のデータ編集画面が開き、データ編集できる。
price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する productname <- c("A", "B", "C", "D") cityname <- c("Tokyo","London") colnames(price)<- productname # price のラベルを productnameにする rownames(price)<- cityname # price のラベルを citynameにする price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力 price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力 price2<-edit(price) price # price を表示 price2 # price2 を表示
編集画面ではセル単位で編集可能。データの編集を終え、edit を終了すると編集画面から戻り、price2へ値が代入される。
以下に実行結果を示す。実行結果に示されているように、edit関数の引数 price は更新されない。編集結果を保存するためには代入の手続き(price2への代入)が必要である。
実行結果
price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する > productname <- c("A", "B", "C", "D") > cityname <- c("Tokyo","London") > colnames(price)<- productname # price のラベルを productnameにする > rownames(price)<- cityname # price のラベルを citynameにする > price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力 > price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力 > > price2<-edit(price) # editで 編集し、結果をprice2へ代入 price # price を表示 price2 # price2 を表示 > > A B C D Tokyo 105 202 155 91 London 107 199 154 99 > A B C D Tokyo 105 202 155 91 London 107 199 154 99 NewYork 103 201 153 NA >
fix
関数 fix では、引数に編集した結果が直接更新されるので代入の手続きは必要ない。
上記例で fix 関数を使う場合のソース、編集画面で同様の操作を行た場合の、実行結果も示す。fix関数の引数 price が更新されている。
price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する productname <- c("A", "B", "C", "D") cityname <- c("Tokyo","London") colnames(price)<- productname # price のラベルを productnameにする rownames(price)<- cityname # price のラベルを citynameにする price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力 price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力 fix(price) # fixで 編集 price # price を表示
実行結果
> price <- matrix(0,2,4) # 要素が 0 の 2行4列の行列を定義する > productname <- c("A", "B", "C", "D") > cityname <- c("Tokyo","London") > colnames(price)<- productname # price のラベルを productnameにする > rownames(price)<- cityname # price のラベルを citynameにする > price[1,] <- c(105,202,155,91) # 1 行目に Vector を 入力 > price[2,] <- c(107,199,154,99) # 2 行目に Vector を 入力 > > fix(price) # fixで 編集 price # price を表示 > > A B C D Tokyo 105 202 155 91 London 107 199 154 99 NewYork 103 201 153 NA >
データファイル読み込み
Rにはテキストファイルを読み込む関数として、read.table, read.csv, scan 等がある。
パス表記
Rではパスを指定するときフォルダを "/" で区切り表記する。例えば、C:\Work\RTest\price.txt を読み込むときは、C:/Work/RTest/price.txt 。
関数 read.table による読み込み
関数 read.table は小、中規模のデータをRに読み込むのに適している。
C:\Work\RTest\price.txt にある次の内容のテキストファイルを読み込む例を挙げる。
データが「スペース」または「タブ」で区切られている場合は、次のように記述する。
data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1) # read.tableでテキストデータ読込み data # 表示
実行結果
> data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1) # read.tableでテキストファイルタ読込み > data # 表示 A B C D Tokyo 105 202 155 91 London 107 199 154 99 >
引数 header=T (またはTRUE)は、データの第1行が列のラベルであることを示す。
row.names=1 は第1列が行のラベルであることを示す。
行、あるいは列のラベルがない場合は、対応する引数を省略する。
また、データが次のように", (カンマ)"で区切られている場合は、sep="," を追加する。
data <-read.table("C:/Work/RTest/price.txt",header=T,row.name=1,sep=",") # read.tableでデータ読込み data # 表示
実行結果
> data <-read.table("C:/Work/RTest/price_c.txt",header=T,row.names=1,sep=",") # sep=","でカンマ区切りのテキストファイル読込み > data # 表示 A B C D Tokyo 105 202 155 91 London 107 199 154 99 >
形式指定が異なる場合
形式指定が異なる場合は、次のような実行結果となる。
data <-read.table("C:/Work/RTest/price_c.txt",header=T,row.names=1) # 指定と異なる形式(カンマ区切り)ファイルを読み込む data # 表示 data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1,sep=",") # 指定と異なる形式(スペース区切り)ファイルを読み込む data # 表示
実行結果
> data <-read.table("C:/Work/RTest/price_c.txt",header=T,row.names=1) # 指定と異なる形式(カンマ区切り)ファイルを読み込む > data # 表示 data frame with 0 columns and 2 rows > > data <-read.table("C:/Work/RTest/price.txt",header=T,row.names=1,sep=",") # 指定と異なる形式(スペース区切り)ファイルを読み込む > data # 表示 data frame with 0 columns and 2 rows
関数 read.csv による読み込み
csv形式(,区切りで拡張子csv)を読み込むときは、関数read.csvを使う。
read.csvの使用法は read.tableと同じ。CSVなので sep="," を指定する必要はない。
data <-read.csv("C:/Work/RTest/price.csv",header=T,row.names=1) data # 表示
実行結果
> data <-read.csv("C:/Work/RTest/price.csv",header=T,row.names=1) > data # 表示 A B C D Tokyo 105 202 155 91 London 107 199 154 99
関数 scan による読み込み
関数 scan は大規模のデータセットを R に読み込むのに適している。
大量のデータを read.table, read.csv に比べ効率よく読み込むことができる。
関数 scan を使うとデータが1行に読み込まれる。関数 scan で読み込んだファイルを2行3列に行列に変更したいときは、関数 matrixと組み合わせる。読み込んだデータは通常、列方向順につめられるが、byrow=T (またはTURE)を指定すると、行方向に詰められる。
data<-scan("C:/Work/RTest/scandata.txt") data m<-matrix(data,3,4) m m2<-matrix(data,3,4,byrow=T) m2
実行結果
> data<-scan("C:/Work/RTest/scandata.txt") Read 12 items > data [1] 1 2 3 4 5 6 7 8 9 10 11 12 > > m<-matrix(data,3,4) > m [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 > m2<-matrix(data,3,4,byrow=T) > m2 [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12 >
数値、文字が混在しているデータを scanで読み込むときは、列ごとにデータの属性を指定する必要がある。
例として次のデータを考える。
data<-scan("C:/Work/RTest/scandata_mix.txt",list(name=" ",a=0,b=0,c=0,d=0)) # listで各列のデータ形式を指定 data # 読込みデータの表示 df<-data.frame(data) # Data Frame へ変換 df # Data farme 表示
実行結果
> data<-scan("C:/Work/RTest/scandata_mix.txt",list(name=" ",a=0,b=0,c=0,d=0)) # listで各列のデータ形式を指定 Read 3 records > data # 読込みデータの表示 $name [1] "A" "B" "C" $a [1] 1 5 9 $b [1] 2 6 10 $c [1] 3 7 11 $d [1] 4 8 12 > > df<-data.frame(data) # Data Frame へ変換 > df # Data farme 表示 name a b c d 1 A 1 2 3 4 2 B 5 6 7 8 3 C 9 10 11 12
データの出力
Rのテキストファイル出力の関数として、write, wite.table, sink等が用意されている。
関数 Write による出力
write を次のように用いる。通常の出力では、データの並びの方向が異なる。転置関数 tを用いることにより方向をあわせることができる。ncolumns で出力するデータ列数を指定している。
data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列 data # data を表示 write(data,"C:/Work/RTest/dataout.txt",ncolumns=4) # 通常出力 write(t(data),"C:/Work/RTest/dataout_t.txt",ncolumns=4) # 転置し出力
実行結果
> data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列 > data # data を表示 [,1] [,2] [,3] [,4] [1,] 1 3 5 7 [2,] 2 4 6 8 > > write(data,"C:/Work/RTest/dataout.txt",ncolumns=4) # 通常出力 > write(t(data),"C:/Work/RTest/dataout_t.txt",ncolumns=4) # 転置し出力 >
append=T (TRUE) を指定すると、既存ファイルに、追加で書き込みを行えます。
data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列 data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列 data # dataを表示 data2 # data2を表示 write(t(data),"C:/Work/RTest/dataout_add.txt",ncolumns=4) # dataを出力 write(t(data2),"C:/Work/RTest/dataout_add.txt",ncolumns=4,append=T) # data2を追加出力
実行結果
> data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列 > data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列 > data # dataを表示 [,1] [,2] [,3] [,4] [1,] 1 3 5 7 [2,] 2 4 6 8 > data2 # data2を表示 [,1] [,2] [,3] [,4] [1,] 9 11 13 15 [2,] 10 12 14 16 > > write(t(data),"C:/Work/RTest/dataout_add.txt",ncolumns=4) # dataを出力 > write(t(data2),"C:/Work/RTest/dataout_add.txt",ncolumns=4,append=T) # data2を追加出力
関数 write.table による出力
write.tableは Data Frame を出力する関数。文字列は " "で囲まれ、数値データはそのまま出力される。書式はwriteの書式と同じ。csv形式でファイルを出力する関数 write.csvも同様。
関数 sink による出力
関数 sink はコンソールに返される内容をファイルとして出力する関数。sink を用いる場合、出力を始める指示コマンドと、出力を終了する指示コマンドが必要である。write
と同様に、引数 append = TRUE も用いると、既存ファイルへ追加出力することができる。
data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列 data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列 sink("C:/Work/RTest/sinkout.txt") # ファイル sinkout.txt にデータ出力開始 data; data2 # dataと data2を表示 sink() # データ出力終了
実行結果
> data <- matrix(1:8,2,4) # 要素が 1から8 の 2行4列の行列 > data2 <- matrix(9:16,2,4) # 要素が 9から16 の 2行4列の行列 > > sink("C:/Work/RTest/sinkout.txt") # ファイル sinkout.txt にデータ出力開始 > data; data2 # dataと data2を表示 > sink() # データ出力終了
参考文献:
- 作者: 金明哲
- 出版社/メーカー: 森北出版
- 発売日: 2007/10/01
- メディア: 単行本(ソフトカバー)
- 購入: 36人 クリック: 694回
- この商品を含むブログ (64件) を見る
- 作者: 青木繁伸
- 出版社/メーカー: オーム社
- 発売日: 2009/04/01
- メディア: 単行本
- 購入: 10人 クリック: 123回
- この商品を含むブログ (34件) を見る
R: The R Project for Statistical Computing