studio - write.csv2 r
write.table escribe la columna vacĂa principal no deseada en el encabezado cuando tiene rownames (5)
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 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 write.table(a, ''a.txt'')
"A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9
de hecho, falta una pestaña vacía ... que es un dolor en el trasero para las cosas de abajo. ¿Es esto un error o una característica? ¿Hay alguna solución? (aparte de write.table(cbind(rownames(a), a), ''a.txt'', row.names=FALSE
)
Saludos, Yancle
Citando ?write.table
, archivos CSV de sección:
Por defecto no hay un nombre de columna para una columna de nombres de fila. Si
col.names = NA
yrow.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.
Entonces debes hacer
write.table(a, ''a.txt'', col.names=NA)
y obtienes
"" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9
Para aquellos que experimentan el mismo problema al guardar una matriz con write.table()
y desean mantener la columna row.names, en realidad hay 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 hacerlo, básicamente está engañando a la función write.table
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
Para cualquiera que trabaje en el tidyverse (dplyr, etc.), la función rownames_to_column()
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
Combinar esto con la opción row.names=FALSE
en write.table()
da como resultado resultados con nombres de encabezado para todas las columnas.
Revisé una función simple de @mnel, que agrega flexibilidad mediante el uso de 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.
¡Aclamaciones!
Una ligera 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 obtienes
"H" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9