我可以将data.frame导出到带有两个标题行的csv,列名称一行,列名称注释一行吗?例如,
d <- data.frame(a=c(1,3,4), b=c(5,6,7))
comment(d$a) <- "MWh"
comment(d$b) <- "%"
write.csv(d, "myfile.csv", ???)
任何暗示都会受到赞赏,也会对评论()的替代方法表示赞赏!
答案 0 :(得分:8)
如果你想保留数据的数字性质,我认为我们不能用一个简单的单行代码(@Chase提供的答案将数据类型更改为字符),但我们可以做到通过一些操作将names(d)
和两个注释首先写入文件,然后使用write.table()
编写csv数据行,附加到我们刚写入的文件名称和注释:
write.csv3 <- function(d, file) {
opts <- options(useFancyQuotes = FALSE)
on.exit(options(opts))
h1 <- paste(dQuote(c("", names(d))), collapse = ",")
h2 <- paste(dQuote(c("", comment(d$a), comment(d$b))), collapse = ",")
writeLines(paste(h1, h2, sep = "\n"), file)
write.table(d, file, sep = ",", append = TRUE, col.names = FALSE)
}
以下是一个例子:
> d <- data.frame(a=c(1,3,4), b=c(5,6,7))
> comment(d$a) <- "MWh"
> comment(d$b) <- "%"
> d
a b
1 1 5
2 3 6
3 4 7
> write.csv3(d, file = "myfile.csv")
生成以下文件:
$ cat myfile.csv
"","a","b"
"","MWh","%"
"1",1,5
"2",3,6
"3",4,7
与@ Chase的回答:
相比$ cat output.csv
"","a","b"
"1","MHh","%"
"2","1","5"
"3","3","6"
"4","4","7"
在两者之间,你应该有足够的选择。
答案 1 :(得分:4)
在写出之前,rbind()
您的评论会data.frame
作为一个选项吗?如果创建新对象,则不会影响现有列的结构或类。
d <- data.frame(a=c(1,3,4), b=c(5,6,7))
output <- rbind(c("MHh", "%"), d)
write.csv(output, "output.csv")
答案 2 :(得分:2)
我对@Gavin Simpson提供的出色答案做了一些小的修改。
在OP中是否需要行名并不明显。我已经删除了这些内容并修改了标题偏移量
使用data.table包中的fwrite()
代替write.table()
将处理时间减少到1/10。
library(data.table)
write.csv3 <- function(data, file, header) {
opts <- options(useFancyQuotes = FALSE)
on.exit(options(opts))
h1 <- paste(dQuote(c(header)), collapse = ",")
h2 <- paste(dQuote(c(names(data))), collapse = ",")
writeLines(paste(h1, h2, sep = "\n"), file)
fwrite(data, file, sep = ",", append = TRUE, col.names = FALSE, row.names = FALSE)
}