Si desea conservar la naturaleza numérica de los datos, no creo que podemos hacerlo con un sencillo de una sola línea (la respuesta proporcionada por @Chase cambia el tipo de datos de carácter), pero podemos hacerlo a través de unas pocas manipulaciones que escriben names(d)
y los dos comentarios fuera al archivo primero y luego utiliza write.table()
para escribir las líneas de datos csv, añadiendo al archivo que acabamos de escribir los nombres y comentarios a:
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)
}
Aquí hay un ejemplo:
> 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")
que produce el siguiente archivo:
$ cat myfile.csv
"","a","b"
"","MWh","%"
"1",1,5
"2",3,6
"3",4,7
en comparación con la producida por @ respuesta de Chase:
$ cat output.csv
"","a","b"
"1","MHh","%"
"2","1","5"
"3","3","6"
"4","4","7"
Entre los dos, usted debe tener suficientes opciones.
Use 'write.table' y' append = TRUE'. –
Le recomiendo encarecidamente que utilice otra forma de anotar su tabla. Si su archivo csv va a ser utilizado por personas que abren el archivo en una hoja de cálculo, estará bien. Pero la instancia en la que alguien quiera hacer algo útil, como leerla en una base de datos o R, el hecho de que haya dos filas formando el encabezado les infligirá mucho dolor. Dicho esto, me gustaría encontrar una forma de agregar una explicación a un marco de datos. ¿Conoces una forma de agregar explicaciones o unidades a un archivo .Rdata que contiene un marco de datos? – Farrel
Solo agregaría unas pocas columnas que comiencen con un carácter único (como/* o #). Esos pueden omitirse fácilmente al leer los datos (en R) por medio de los primeros caracteres o simplemente omitiendo las primeras x filas. 'sink' parece que podría hacer frente a eso. –