write.table写道不需要导致空栏头有rownames时
-
21-09-2019 - |
题
检查此示例:
> 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
其它)
干杯, 的Yannick
解决方案
援引?write.table
,部分的 CSV文件强>:
默认情况下不存在用于列名 列名的一列。如果
col.names = NA
和row.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等),从该rownames_to_column() href="https://www.rdocumentation.org/packages/radiant.data/versions/0.6.0/topics/rownames_to_column" rel="nofollow noreferrer"> 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()
选项中输出与所有列标题名称结合于此。
对于那些具有保存一个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
我修改从@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' 等
干杯!