escribir.tabla escribe no deseados líder en vacío columna de cabecera cuando ha rownames

StackOverflow https://stackoverflow.com/questions/2478352

  •  21-09-2019
  •  | 
  •  

Pregunta

marque este ejemplo:

> 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 para el archivo...

write.csv(a, 'a.csv') lo que da como se espera:

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

y write.table(a, 'a.txt') que los tornillos

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

de hecho, un vacío ficha que falta....que es un dolor en el culo para la ejecución de las cosas.Es esto un error o una función?¿Hay una solución?(aparte de write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

Saludos, yannick

¿Fue útil?

Solución

Citando ?write.table, la sección CSV

  

Por defecto no hay ningún nombre de columna para   una columna de nombres de las filas. Si col.names = NA y row.names = TRUE un espacio en blanco   se añade nombre de la columna, que es el   convención utilizada para los archivos CSV para ser   leído por 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

Otros consejos

Una ligera modificación a @Marek respuesta muy útiles a añadir una cabecera a la columna de rownames:. Añadir temporalmente los rownames como la primera columna en el hoja.de.datos, y escribir que, haciendo caso omiso de las rownames 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

Para cualquier persona que trabaje en el tidyverse (dplyr, etc.), la función rownames_to_column() de la 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 los resultados de la producción write.table() con los nombres de cabecera para todas las columnas.

Para aquellos que experimentan el mismo problema al guardar una matriz con write.table() y quieren mantener la columna de la row.names, en realidad hay una solución muy sencilla:

 write.table(matrix,file="file.csv",quote=F,sep=";", row.names=T
             col.names=c("row_name_col;val1_col","val2_col"))

Al hacer esto que está básicamente engañar a la función write.table en la creación de una etiqueta de cabecera de la columna de la row.names. El archivo .csv resultante sería el siguiente:

row_name_col;val1_col;val2_col
row1;1;4 
row2;2;5 
row3;3;6 

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.

Saludos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top