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
> 
変数型の変換

関数 fix や 関数 edit を用いて作成した Data Frameの変数型を変換する方法を示す。
関数 fix を用いて編集画面を開き、ラベルを左クリック(例では"A")すると、変数エディタが開く。
数値にしたいときは numeric、質的データにしたいときは character を指定する。


データファイル読み込み

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
他Softwareファイル形式

パッケージ foreign を用いると SASSPSS, Stata, S-PLUSのファイル形式も読み込むことができる。

データの出力

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() # データ出力終了

出力ファイル

参考文献:

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによる統計解析

Rによる統計解析

http://www.math.montana.edu/Rweb/Rhelp/00Index.html
R: The R Project for Statistical Computing