一所懸命に手抜きする

デスクワークばかりのスポーツ嫌いで50歳も過ぎ、いよいよ足腰に衰えを感じつつある昨今。

write.csv() で簡単にCSV出力。ただしrow.names=TRUE/FALSEを意識する必要あり (R言語)

データやり取りはCSVが基本

 企業では Excel がデータソースとなることが多いですが、学究の場などでは CSV が基本ではないかと思います。

CSVやTSVを書き出すのは簡単です

  参考 R: Data Output

write.csv()で簡単にCSVが出力できます

 Rで処理したデータフレームをCSVに書き出すのは 標準関数 write.csv() で簡単にできます。

write.csv(.Dataset, "C:/Wrk/abc.csv")

 これだけでCSVが出力されます。簡単です。

クリップボードへも簡単出力

 クリップボードにも

write.csv(.Dataset, "clipboard")

 とするだけで出力できますから、Excelに簡単にデータを貼り付けることができます。

引数不要とは制限が厳しいということでもある

 しかし、引数を指定しなくても良いということは、デフォルトで引数が指定されていたり、そもそも関数の動作が限定されているということです。write.csv() は write.table() の wrapper であり、write.table()に渡す引数を限定しています。意図せぬ形式にならないように write.table の説明をよく読むべきです。

write.table()

 元になっている write.table() は

Rの標準関数 write.table()
 write.table(.Dataset, FilePath,append = FALSE, quote = TRUE, sep = " ",
            eol = "\n", na = "NA", dec = ".", row.names = TRUE,col.names = TRUE,
            qmethod = c("escape", "double"),fileEncoding = "")
write.csv()

write.table() の wrapper である write.csv() は

Rの標準関数 write.csv()
 write.csv(x, file = "", append = FALSE, quote = TRUE, sep = ",",
            eol = "\n", na = "NA", dec = ".", row.names = TRUE,
            col.names = NA, qmethod = "double",
            fileEncoding = "")

write.tableとの相違点
 1. append, col.names, sep, dec, qmethod は変更できない。
 2. sep = "," 固定
 3. dec = "." 固定
 4. col.names = NA固定
 5. qmethod = "double" 固定
これらは CSV ファイルであることを厳格に担保するための引数固定なのでありがたい配慮ではありますが…。
a-habakiri.hateblo.jp

col.names=NAはいじれないのでヘッダが必ず付与されることにも注意
write.csv(.Dataset, "C:/Wrk/abc.csv", col.names=FALSE) 
警告メッセージ: write.csv(.Dataset, "C:/Wrk/abc.csv", col.names=FALSE): 
'col.names' への変更の試みは無視されました 

write.csv()ではcol.namesへのパラメータ指定は無視されます。列名、すなわちヘッダは必ず付与される仕様になっています。

ヘッダなしCSVはwrite.table()で出力できる

元のwrite.table()を用いて

write.table(.Dataset, "C:/Wrk/abc.csv", col.names=FALSE)

とすることでヘッダなしCSVにできます。

row.names=TRUE/FALSEは注意が必要

write.csv()ではデフォルトだと row.names=TRUE となっていて行見出しが一番左端に出力されます。

##  支社番号 支社名 支店番号 支店名
##1       10   札幌       11   札幌
##2       20   東京       21 大手町
##3       20   東京       22 秋葉原
##4       20   東京       23   横浜

左端の1,2,3,4が行見出しrow.namesです。

行見出しrow.namesにobservation IDを用いることもできる

 行見出しは行番号とは決まっておらず、

rownames(.Dataset)=c("山田太郎" ",鈴木花子"...)などとしておくと
##         テスト  算数 国語
##山田太郎     11  100    90
##鈴木花子     11   90    80

 のような observation ID を用いることもあります。

書き出したCSVを読み込むときの注意

write.csv(row.names=TRUE) で書き出した CSV は read.csv で読み込む。

 write.csv() はデフォルトだと row.names=TRUE なので行見出し付きで出力します。

    # デフォルトだと row.names=TRUE
write.csv(.Dataset, "C:/Wrk/abc.csv")

    # 引数を正しく指定しないと…
read.csv("C:/Wrk/abc.csv")
##  X 支社番号 支社名 支店番号 支店名
##1 1       10   札幌       11   札幌
##2 2       20   東京       21 大手町
##3 3       20   東京       22 秋葉原
##4 4       20   東京       23   横浜

    # row.names=1で左端が行名と伝えると
read.csv("C:/Wrk/abc.csv",row.names=1)
##  支社番号 支社名 支店番号 支店名
##1       10   札幌       11   札幌
##2       20   東京       21 大手町
##3       20   東京       22 秋葉原
##4       20   東京       23   横浜

 このケースはデフォルトの row.names=TRUE なので行見出し付きで出力しました。
 read.csv()する際、オプションを指定しないと行見出しをデータとして読み込んで意図しないことになります。
   read.csv()する際、row.names=1 と1列が見出しだと教えてやると正しく読み込めます。
 

write.csv(row.names=FALSE) で書き出した CSV は read.csv() でそのまま読み込める。
write.csv(.Dataset, "C:/Wrk/abc.csv",row.names=FALSE)
read.csv("C:/Wrk/abc.csv")
##  支社番号 支社名 支店番号 支店名
##1       10   札幌       11   札幌
##2       20   東京       21 大手町
##3       20   東京       22 秋葉原
##4       20   東京       23   横浜

a-habakiri.hateblo.jp