行名がある場合、write.tableは不要な先頭の空の列をヘッダーに書き込みます


90

この例を確認してください:

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
> a
  A B C
A 1 4 7
B 2 5 8
C 3 6 9

テーブルは正しく表示されます。ファイルに書き込む方法は2つあります...

write.csv(a, 'a.csv') これは期待通りです:

"","A","B","C"
"A",1,4,7
"B",2,5,8
"C",3,6,9

そして、write.table(a, 'a.txt')どのねじ込み

"A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

確かに、空のタブがありません....これは、下流のことをするのに苦痛です。これはバグですか、それとも機能ですか?回避策はありますか?(以外write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE

乾杯、ヤンニック

回答:


137

引用?write.table、セクションCSVファイル

デフォルトでは、行名の列には列名はありません。もしcol.names = NAおよびrow.names = TRUE空白の列名は、スプレッドシートによって読み込まれるCSVファイルのために使用される規則である、追加されます。

だからあなたはしなければならない

write.table(a, 'a.txt', col.names=NA)

そしてあなたは得る

"" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

4
@Marek、行名列に名前を追加することは可能ですか?つまり、「」の代わりに「ID」などを追加しますか?
ドナイエル2013年

2
@Dnaiel私があなたができないことを知っていることから。行名をデータにバインドして、(問題のように)名前を付けることができます。
Marek、

1
@rusalkaguyあなたの編集には意味がありません。この「拡張」は元の質問(「以外の回避策」)にあります
Marek

各列の番号をどのようにしてcol名の下に並べますか?
14:14にrrs

@rrs固定幅フォーマットですか?gdataパッケージのwrite.fwfを見てください。そして、コメントの代わりに新しい質問をしてください。そして、なぜそれが必要なのですか?
Marek

10

@Marekの非常に役立つ回答を少し変更すると、行名列にヘッダーが追加されます。一時的に行名をdata.frameの最初の列として追加し、実際の行名を無視して書き込みます。

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
> write.table(data.frame("H"=rownames(a),a),"a.txt", row.names=FALSE)

そしてあなたは得る

"H" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

マレクの回答を編集してこれを含める必要があると思います。
user8397947 2016

3

tidyverse(dplyrなど)で作業している人rownames_to_column()は、tibbleパッケージの関数を使用して、row.namesを列に簡単に変換できます。例:

library('tibble')
a = as.data.frame(matrix(1:9, nrow=3, ncol=3, 
                  dimnames=list(LETTERS[1:3], LETTERS[1:3])))

a %>% rownames_to_column('my_id')

  my_id A B C
1     A 1 4 7
2     B 2 5 8
3     C 3 6 9

これをrow.names=FALSEオプションと組み合わせると、write.table()すべての列のヘッダー名が出力されます。


1

で行列を保存するときに同じ問題が発生しwrite.table()、row.names列を保持したい場合、実際には非常に単純な解決策があります。

 write.table(matrix,file="file.csv",quote=F,sep=";", row.names=T
             col.names=c("row_name_col;val1_col","val2_col"))

そうすることで、基本的にはwrite.table関数をだまして、row.names列のヘッダーラベルを作成します。結果の.csvファイルは次のようになります。

row_name_col;val1_col;val2_col
row1;1;4 
row2;2;5 
row3;3;6 

col.names = c( "row_name"、colnames(matrix))を試していると、「col.names」の指定が無効であるというエラーが表示されます。何が間違っているのでしょうか?c( "row_name"、colnames(matrix))は正しいテキストを提供します。
MichaelE

write.table長さのヘッダーを期待し、ncol(matrix)あなたはそれをもう一つ与えています。上記の解決策を試してみましたが、機能しません。他の解決策と同様に、行名を列として移動するのが最善です
aurelien

0

接続を使用して柔軟性を追加する、@ mnelの単純な関数を修正しました。これが関数です:

my.write <- function(x, file, header, f = write.csv, ...){
# create and open the file connection
datafile <- file(file, open = 'wt')
# close on exit 
on.exit(close(datafile))
# if a header is defined, write it to the file (@CarlWitthoft's suggestion)
if(!missing(header)) {
writeLines(header,con=datafile, sep='\t')
writeLines('', con=datafile, sep='\n')
}
# write the file using the defined function and required addition arguments  
f(x, datafile,...)
}

関数を「write.table」、「write.csv」、「write.delim」などに指定できます。

乾杯!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.