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 9
fuente
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 9
La combinación de esto con la
row.names=FALSE
opció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.table
funció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;6
fuente
write.table
espere 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