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

Yan*_*urm 84 r export-to-csv write.table

检查这个例子:

> 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
Run Code Online (Sandbox Code Playgroud)

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

write.csv(a, 'a.csv') 这给出了预期:

"","A","B","C"
"A",1,4,7
"B",2,5,8
"C",3,6,9
Run Code Online (Sandbox Code Playgroud)

write.table(a, 'a.txt')这螺丝了

"A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9
Run Code Online (Sandbox Code Playgroud)

事实上,缺少一个空的标签....这对于下游事物来说是一种痛苦.这是一个错误还是一个功能?有解决方法吗?(除了write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

干杯,yannick

Mar*_*rek 130

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

默认情况下,行名称列没有列名.如果col.names = NArow.names = TRUE一个空白列名加入,它是用于CSV文件的约定,以通过电子表格读取.

所以你必须这样做

write.table(a, 'a.txt', col.names=NA)
Run Code Online (Sandbox Code Playgroud)

你明白了

"" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9
Run Code Online (Sandbox Code Playgroud)

  • @Marek,是否可以在rownames列中添加名称?即,而不是"",添加"ID"或类似的东西? (4认同)
  • @Dnaiel据我所知你不能.您可以使用数据绑定行名称并为其指定名称(如同问题一样). (2认同)

小智 7

稍微修改一下@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)
Run Code Online (Sandbox Code Playgroud)

你明白了

"H" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9
Run Code Online (Sandbox Code Playgroud)


Kei*_*itt 6

对于在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
Run Code Online (Sandbox Code Playgroud)

将此选项与row.names=FALSEinwrite.table()选项相结合会产生包含所有列标题名称的输出。