2010-03-19 40 views
68

检查这个例子中,当:write.table写入不需要的领先空列报头具有rownames

> 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

干杯, 雅尼克

回答

97

援引?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 
+4

@Marek,是否可以给rownames列添加一个名字?即,而不是“”,添加“ID”或类似的东西? – Dnaiel 2013-11-22 19:22:00

+2

@Dnaiel从我所知道的你不能。你可以将行名与数据绑定并给它们命名(就像问题一样)。 – Marek 2013-12-02 21:02:11

+1

@rusalkaguy您的编辑没有意义。这个“扩展名”是在原来的问题(“除了”之外的解决方法) – Marek 2016-07-14 05:24:30

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

干杯!

4

对@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 
+0

你应该编辑马立克的答案,包括这个,我想。 – dorukayhan 2016-07-07 21:22:16

3

对于任何人在tidyverse工作(dplyr等),从tibblerownames_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选项输出结合这为所有列。