2010-03-19 4 views
68

verificación de este ejemplo:write.table escribe no deseada columna de vacío que conduce a la cabecera cuando tiene rownames

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3])) 
> a 
    A B C 
A 1 4 7 
B 2 5 8 
C 3 6 9 

la tabla muestra correctamente. Hay dos formas diferentes de escritura en el File ...

write.csv(a, 'a.csv') lo que da como era de esperar:

"","A","B","C" 
"A",1,4,7 
"B",2,5,8 
"C",3,6,9 

y write.table(a, 'a.txt') que se atornilla hasta

"A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 

de hecho, una pestaña vacía no se encuentra. ... que es un dolor en el trasero para las cosas aguas abajo. ¿Es esto un error o una característica? ¿Hay alguna solución? (Que no sea write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

Saludos, Yannick

Respuesta

97

Citando ?write.table, archivos CSV sección :

Por defecto no hay ningún nombre de columna para una columna de nombres de las filas. Si se agregan col.names = NA y row.names = TRUE, se agrega un nombre de columna en blanco, que es la convención utilizada para que los archivos CSV sean leídos por las hojas de cálculo.

Por lo que debe hacer

write.table(a, 'a.txt', col.names=NA) 

y se obtiene

"" "A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 
+4

@Marek, ¿sería posible agregar un nombre a la columna de nombres de fila? Es decir., en lugar de "", agregue "ID" o algo por el estilo? – Dnaiel

+2

@Dnaiel Por lo que sé, no puedes. Puede enlazar nombres de fila con datos y darles nombres (como en cuestión). – Marek

+1

@rusalkaguy Su edición no tiene sentido. Esta "extensión" está en la pregunta original ("solución alternativa a") – Marek

0

me revisó una simple función de @mnel, que añade flexibilidad mediante el uso de conexiones. Esta es la función:

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,...) 
} 

Puede especificar la función de ser 'write.table', 'write.csv', '' write.delim etc.

Salud!

4

Una pequeña modificación en @Marek respuesta muy útil Agregará un encabezado a la columna de nombres de fila: agregue temporalmente los nombres de fila como la primera columna en el data.frame y escriba eso, ignorando los nombres de fila reales.

> 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) 

y se obtiene

"H" "A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 
+0

Debe editar la respuesta de Marek para incluir esto, creo. – dorukayhan

3

para cualquiera que trabaje en el tidyverse (dplyr, etc.), la función rownames_to_column() del paquete tibble se puede utilizar para convertir fácilmente row.names a una columna, por ejemplo:

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 A B C 
1  A 1 4 7 
2  B 2 5 8 
3  C 3 6 9 

Combinando esto con la opción row.names=FALSE en write.table() resultados de la producción con nombres de encabezado para todas las columnas

Cuestiones relacionadas