当有rownames时,write.table将不需要的前导空列写入标题

检查这个例子:

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3])) > a ABC 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 

事实上,一个空的标签丢失….这是下游事情的屁股疼痛。 这是一个错误还是一个function? 有没有解决方法? (除了write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE

欢呼,yannick

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

默认情况下,行名不存在列名。 如果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 

稍微修改@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 

对于所有在tidyverse (dplyr等)中工作的人来说,可以使用tibble包中的rownames_to_column ( 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 ABC 1 A 1 4 7 2 B 2 5 8 3 C 3 6 9 

将其与write.table()row.names=FALSE选项结合使用,可以输出所有列的标题名称。

我从@mnel修改了一个简单的函数,通过使用连接增加了灵活性。 这是function:

 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'等

干杯!