当有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 = 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等)中工作的人来说,可以使用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'等
干杯!