45. ファイルへのデータ出力


データフレームの出力

read.table() に対して関数 write.table() や write() で実現できる.例えば以下の様な 5 行 3 列のデータが入ったファイル data11.txt が( C:/ に)あったとする.このデータ data11.txt を関数 read.table() で読み込んで,関数 write.table(データフレーム名, "出力するファイルのパス") でファイル output.txt に出力してみる.write.table(x,"C:/output.txt") だけでは(quote=F にしないと)要素に "" がついてしまう.

 
 x <- read.table("C:/data11.txt")
 write.table(x, "C:/output.txt", quote=F, 
             col.names=F, append=T)

 # append=F にするとデータをファイルに上書きする

 data11.txt

 
0.9, 1.2, 1.9
1.3, 1.6, 2.7
2.0, 3.5, 3.7
1.8, 4.0, 3.1
0.9, 1.2, 1.9

MASS ライブラリ中の関数 write.matrix() も write.table() と同様の機能を持つ.

データフレームを出力する際は write.table() が使いやすいが,リストをファイルに出力する場合は write(リスト名, "出力するファイルのパス") が使いやすい.それぞれの関数の書式は以下のようになっている.「出力するファイルのパス」は,空文字列 "" なら標準出力に出力される.

関数 write() について使い方の例を以下に挙げる.

 
 x <- matrix(1:8, ncol=2)                 # 4 * 2 の行列
 write(x, file="data12.txt")              # ファイル data12.txt に書き出し
 scan("data12.txt")                       # scan 関数で再読み込み(結果はベクトル)

Read 8 items
[1] 1 2 3 4 5 6 7 8

 y <- matrix(scan("data12.txt"), ncol=4)  # また行列に変換

Read 8 items

 y

     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

ファイルそのものを直接編集しない場合,関数 save() でデータの構造をそのまま記録してくれる.呼び出す場合は関数 load() を用いる.

 
 save(x, file="data13.dat") 
 rm(x)                                    # ファイル data13.dat は
 load("data13.dat")                       # テキストデータではない!

区切り文字を付けたデータの出力

 リストに入ったデータを,例えばカンマ ,で区切ってファイルに出力する場合,まず,「データ ,カンマ,データ ,カンマ,・・・」 というリストを作っておいて,次に関数 write() で 1 行ごとにファイルに出力すればよい.

 
 x <- c(1:9)
 out <- NULL
 for (i in 1:(length(x)-1)) {
   out <- cbind(out, x[i]) 
   out <- cbind(out, ",")
 }
 out <- cbind(out, x[length(x)])
 write(out, file="C:/data14.txt", ncolumns = 2*length(x))

 data14.txt

 
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

 また,関数 writeLines(paste(データ), sep=",") とすれば区切り文字を綿密に指定してファイルに書き込みを行うことが出来る.この際,明示的に改行\n を指定しないと改行されない.

 
 out <- file("C:/data15.txt", "w") # 書き込みモードで開く
 for (i in 1:10) {
   if (i < 5)       writeLines(paste(i), out, sep=", ")
   else if (i == 5) writeLines(paste(i), out, sep="\n")
   else if (i < 10) writeLines(paste(i), out, sep=", ")
   else             writeLines(paste(i), out, sep="")
 }
 close(out)                        # ファイルを閉じる

 data15.txt

 
1, 2, 3, 4, 5
6, 7, 8, 9, 10

出力したファイルを EXCEL で読み込む

R で出力したファイルを EXCEL(または OpenOffice の calc )から読み込む場合の一つの例を示す.

  1. 前節の説明の方法で,データをカンマ区切りで出力し,拡張子を【.csv】として保存する(【.txt】としても読み込むことは出来る).
  2. メニューの [ファイル] の [開く] から,出力されたファイルを開く.その際,ファイルの種類を [テキスト ファイル (*.prn, *.txt, *.csv)] とする.
  3. 目的のファイルを選択して [開く] をクリックする.

ちなみに,関数 write.xlsx() や関数 write.xlsx2() (高速版)で EXCEL ファイルにデータを書き込むことも出来る.

 
 install.packages("xlsx", dep=T);
 library(xlsx);
 ( x <- data.frame(a=1:2, b=c("P","Q")) )

  a b
1 1 P
2 2 Q

 write.xlsx(x, "C:/temp/mydata.xlsx", sheetName="Sheet1")

他にもパッケージ xlsReadWrite が用意されている.


データの tex ・ html 命令への変換

以下のデータ x を,LaTeX の表を出力する命令に書き直す場合は以下のようにする.

 
 library(xtable) 
 x <- matrix(1:24,4,6) 
 x 
  
     [,1] [,2] [,3] [,4] [,5] [,6] 
[1,]    1    5    9   13   17   21 
[2,]    2    6   10   14   18   22 
[3,]    3    7   11   15   19   23 
[4,]    4    8   12   16   20   24 
 
 mytable <- xtable(x) 
 print(mytable) 
 
% latex table generated in R 1.8.1 by xtable 1.2-1 package 
% Mon Feb 02 00:44:46 2004 
\begin{table}[ht] 
\begin{center} 
\begin{tabular}{rrlllr} 
\hline 
 & grade & sex & disadvg & ethnicty & tlimth \\ 
\hline 
1 & 6 & M & YES & HISPANIC & 43 \\ 
2 & 7 & M &  NO &    BLACK & 88 \\ 
3 & 5 & F & YES & HISPANIC & 34 \\ 
4 & 3 & M & YES & HISPANIC & 65 \\ 
5 & 8 & M & YES &    WHITE & 75 \\ 
6 & 5 & M &  NO &    BLACK & 74 \\ 
7 & 8 & F & YES & HISPANIC & 72 \\ 
8 & 4 & M & YES &    BLACK & 79 \\ 
9 & 6 & M &  NO &    WHITE & 88 \\ 
10 & 7 & M & YES & HISPANIC & 87 \\ 
11 & 3 & M &  NO &    WHITE & 79 \\ 
12 & 6 & F &  NO &    WHITE & 84 \\ 
13 & 8 & M &  NO &    WHITE & 90 \\ 
14 & 5 & M &  NO &    WHITE & 73 \\ 
15 & 8 & F &  NO &    WHITE & 72 \\ 
16 & 6 & F &  NO &    BLACK & 82 \\ 
17 & 4 & M &  NO &    WHITE & 69 \\ 
18 & 3 & F & YES & HISPANIC & 17 \\ 
19 & 3 & M &  NO & HISPANIC & 37 \\ 
20 & 5 & M &  NO &    WHITE & 70 \\ 
\hline 
\end{tabular} 
\end{center} 
\end{table}

このデータ x を,html の表を出力する命令に書き直す場合は以下のようにする.

 
 print(mytable,type="html")

他にもパッケージ Hmisc 中の関数 latex() がある.