2011-02-28 11 views
7

¿Puedo exportar un data.frame a csv con dos líneas de encabezado, una línea para los nombres de las columnas y una línea para los comentarios sobre los nombres de las columnas? Por ejemplo,escribir csv con dos líneas de encabezado?

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", ???) 

Cualquier sugerencia apreciada, también sobre alternativas para comentar()!

+1

Use 'write.table' y' append = TRUE'. –

+0

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

+0

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. –

Respuesta

7

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.

+0

Si desea volver a leer los datos producidos en R, los datos serán de clase 'factor' o' character' (dependiendo de 'stringsAsFactors'), pero supongo que esto es más bien unidireccional de R a otra cosa. –

+0

Gran solución; esto ayuda mucho! –

4

¿Podría rbind() escribir sus comentarios en la parte superior de su data.frame ser una opción antes de escribir? Si crea un objeto nuevo, no afectará la estructura o clase de las columnas existentes.

d <- data.frame(a=c(1,3,4), b=c(5,6,7)) 
output <- rbind(c("MHh", "%"), d) 
write.csv(output, "output.csv") 
Cuestiones relacionadas