mira 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 se muestra correctamente. Hay dos formas diferentes de escribirlo en un archivo ...
write.csv(a, 'a.csv') que da como se esperaba:
"","A","B","C"
"A",1,4,7
"B",2,5,8
"C",3,6,9
y write.table(a, 'a.txt')que arruina
"A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9
de hecho, falta una pestaña vacía ... lo cual es un dolor de cabeza para las cosas posteriores. ¿Es esto un error o una característica? ¿Existe alguna solución? (que no sea write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)
Saludos, Yannick
fuente

Una ligera modificación a @Marek, una 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 escríbalo, 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 obtienes
"H" "A" "B" "C" "A" 1 4 7 "B" 2 5 8 "C" 3 6 9fuente
Para cualquiera que trabaje en tidyverse (dplyr, etc.), la
rownames_to_column()función del paquete tibble se puede usar para convertir fácilmente row.names en 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 9La combinación de esto con la
row.names=FALSEopción enwrite.table()da como resultado una salida con nombres de encabezado para todas las columnas.fuente
Para aquellos que experimentan el mismo problema al guardar una matriz
write.table()y desean mantener la columna row.names, en realidad existe una solución extremadamente simple:write.table(matrix,file="file.csv",quote=F,sep=";", row.names=T col.names=c("row_name_col;val1_col","val2_col"))Al hacer eso, básicamente está engañando a la
write.tablefunción para que cree una etiqueta de encabezado para la columna row.names. El archivo .csv resultante se vería así:row_name_col;val1_col;val2_col row1;1;4 row2;2;5 row3;3;6fuente
write.tableespere un encabezado de longitudncol(matrix)y le está dando uno más. Probé la solución anterior, no funciona, lo mejor es mover los nombres de fila como una columna como en otras solucionesRevisé una función simple de @mnel, que agrega flexibilidad al usar conexiones. Aquí está 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 que la función sea 'write.table', 'write.csv', 'write.delim', etc.
¡Salud!
fuente