一所懸命に手抜きする

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

write.table()と列見出し・行見出し: row.names,col.names の設定について【R】

write.table()と列見出し・行見出し

R言語では write.csv() により簡単にCSVを出力できるのでした。 a-habakiri.hateblo.jp しかし、少し体裁をいじろうとすると、 write.table() を理解する必要があるのでした。 a-habakiri.hateblo.jp

 write.table() は write.csv() より柔軟な分、列見出し(row.names)や行見出し(col.names、いわゆるヘッダ)についてよく理解する必要があります。
 また、そもそもwrite.tableでは区切り文字(sep)が半角スペースとなっていますから、CSVとするには区切り文字をカンマ(,)であると明示的に指定しなくてはなりません。
 サンプルデータの列見出し・行見出しを様々な設定で書き込んで確認してみます。

sample.CSV
"年",2018,2019
"数学得点",82.2,80.6
"英語得点",80.1,81.3
sample.CSVを読み込んでみる
(D<-read.csv("sample.CSV",check.names=FALSE))2018 2019
1 数学得点 82.2 80.6
2 英語得点 80.1 81.3

 左端の1,2はrow.namesですが、デフォルトではレコード番号になっています。
 row.namesは不要と感じる人も多いと思いますが、社会心理学などの統計処理ではオブザーベイションID(observation ID)と言ってどの被験者のデータかを表すユニークコードを用意するのが普通です。row.namesはそのobservation IDにあたるものです。

row.names,col.namesの設定を試してみる
【1】write.table(D,"test.csv",sep = ",",row.names=FALSE,col.names=FALSE)
"数学得点",82.2,80.6
"英語得点",80.1,81.3
【2】write.table(D,"test.csv",sep = ",",row.names=TRUE,col.names=FALSE)
"1","数学得点",82.2,80.6
"2","英語得点",80.1,81.3

 row.names=TRUEとすると、row.names付きでファイルに書き出されます。

【3】write.table(D,"test.csv",sep = ",",row.names=TRUE,col.names=TRUE)
"年","2018","2019"
"1","数学得点",82.2,80.6
"2","英語得点",80.1,81.3

 row.namesに列名がないため、列名が一つずれています。このパラメータ指定は使用しないことです。

【4】write.table(D,"test.csv",sep = ",",row.names=FALSE,col.names=TRUE)
"年","2018","2019"
"数学得点",82.2,80.6
"英語得点",80.1,81.3

 元のCSVに一番近いものです。  write.csv(D,"test.csv",row.names=FALSE)と同じです。

【5】write.table(D,"test.csv",sep = ",",row.names=TRUE,col.names=NA)
"","年","2018","2019"
"1","数学得点",82.2,80.6
"2","英語得点",80.1,81.3

 write.csv(D,"test.csv",row.names=TRUE)と同じです。

【6】write.table(D,"test.csv",sep = ",",row.names=FALSE,col.names=NA)
 write.table(D, "test.csv", sep = ",", row.names = FALSE, col.names = NA) でエラー: 
   'row.names = FALSE' の時は 'col.names = NA' は無意味です 

 列見出しがないときには列見出しの上に列名を付ける必要がありませんから、エラーとなります。このパラメータ指定は使用できません