当具有行名时,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

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

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

干杯,扬尼克

Answers:


137

引用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

4
@Marek,是否可以在行名列中添加名称?即,添加“ ID”或类似的内容代替“”?
Dnaiel 2013年

2
@Dnaiel据我所知你做不到。您可以将行名称与数据绑定,并为其命名(如所讨论的一样)。
Marek

1
@rusalkaguy您的编辑没有意义。此“扩展名”是原始问题(“其他解决方法”)
Marek

您如何获得每列中要在col名称下对齐的数字?
rrs '17

@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

我认为,您应该编辑Marek的答案以包括此内容。
user8397947 '16

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”等。

干杯!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.