この例を確認してください:
_> 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
以外)
乾杯、ヤニック
引用?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
@Marekへの非常に役立つ回答を少し変更すると、rownames列にヘッダーが追加されます。data.frameの最初の列としてrownamesを一時的に追加し、実際のrownamesを無視して書き込みます。
> 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
tidyverse (dplyrなど)で作業している場合は、 tibble パッケージのrownames_to_column()
関数を使用して、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
_
これをwrite.table()
の_row.names=FALSE
_オプションと組み合わせると、すべての列のヘッダー名が出力されます。
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
接続を使用して柔軟性を追加する@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」などに指定できます。
乾杯!