用两个标题行写csv?

时间:2011-02-28 16:04:07

标签: r

我可以将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", ???)

任何暗示都会受到赞赏,也会对评论()的替代方法表示赞赏!

3 个答案:

答案 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)
}