99

检查这个例子:

> 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

表格正确显示。有两种不同的方式将其写入文件...

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

干杯,扬尼克

4

5 回答 5

146

引用CSV 文件?write.table部分:

默认情况下,行名列没有列名。如果添加col.names = NArow.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
于 2010-03-19T15:45:03.653 回答
10

对@Marek 非常有用的答案稍作修改将在 rownames 列中添加一个标题:临时将 rownames 添加为 data.frame 中的第一列,然后写下来,忽略真正的 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
于 2016-07-07T21:16:40.783 回答
4

对于在tidyverse(dplyr 等)中工作的任何人,可以使用 tibble 包中的函数轻松地将 row.names 转换为列,例如rownames_to_column()

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选项 in结合使用会write.table()导致输出带有所有列的标题名称。

于 2017-01-26T19:30:28.240 回答
3

对于那些在保存矩阵时遇到相同问题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 
于 2018-04-08T16:15:06.697 回答
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”等。

干杯!

于 2015-05-03T18:35:25.927 回答