write txt studio read csv2 r csv file-io

txt - write.csv r documentation



readr: desactiva la notación científica en write_csv (6)

Escribí una solicitud de extracción con un parche para mejorar el control de la notación científica en write_csv .

Con este parche, tendría un argumento int_use_scientific=FALSE en write_csv que resolvería su problema. Esperemos que eventualmente se fusione.

Estoy usando R para procesar los datos del Censo, que utiliza GEOID numéricos muy largos para identificar las geografías. El problema al que me enfrento es que al escribir los datos procesados ​​utilizando write_csv (del paquete de readr ), está escribiendo estos GEOID en notación científica. ¿Hay una manera de evitar esto?

Nota: soy capaz de alternar la visualización de notación científica en la consola R utilizando la opción de scipen en un valor suficientemente grande. Pero esta configuración no parece extenderse a la biblioteca de readr .

Aquí hay un conjunto de datos de juguete:

library(dplyr) library(readr) # which is the package with write_csv (tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))) Source: local data frame [6 x 1] GEOID 1 60150001022000 2 60150001022001 3 60150001022002 4 60150001022003 5 60150001022004 6 60150001022005 write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv")

Esto es lo que estoy recibiendo actualmente. Estoy buscando una manera de obtener los mismos números que arriba:

GEOID 6.02E+13 6.02E+13 6.02E+13 6.02E+13 6.02E+13 6.02E+13


Prefiero sugerir la recodificación de tales columnas al tipo int , porque si es así, write_* no usará más la codificación de números científicos. Para convertir todas las columnas numéricas en una sola pasada (por ejemplo, en caso de que esté tratando con una matriz de conteos), podría hacer:

require(dplyr) tbl_df = mutate_if(tbl_df, is.numeric, as.integer)


Probablemente sería más seguro usar valores de caracteres:

X <- tbl_df(data.frame(GEOID = as.character(seq(from=60150001022000, to=60150001022005)))) write_csv(X, "test.csv")

Es un poco irónico que la función write_csv obligue a algunos de sus resultados a valores de caracteres, pero no a columnas numéricas. Solo si una columna pasa la prueba is.object será obligada. No parece haber un interruptor para lanzar que mantenga la máxima precisión. Las write.table y sus funciones write.csv tienen varios conmutadores que permiten la supresión de comillas y otras configuraciones que permiten la personalización de la salida, pero write_csv tiene muy poco de write_csv .

Puede engañar a write_csv para que piense que una columna numérica es algo más complejo y esto da como resultado el resultado de as.character , aunque con comillas.

class(X[[1]])<- c("num", "numeric") vapply(X, is.object, logical(1)) #GEOID # TRUE write_csv(X, "") #[1] #"/"GEOID/"/n/"60150001022000/"/n/"60150001022001/"/n/"60150001022002/"/n/"60150001022003/"/n/"60150001022004/"/n/"60150001022005/"/n"

Como cuestión de mejores prácticas, no estoy de acuerdo con su elección de insistir en que las variables de ID sean numéricas. Hay demasiada violencia que se puede aplicar a ese modo de almacenamiento para un objeto. No necesita ninguna de las operaciones aritméticas para una variable de ID.


Te sugiero que uses

write.csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv")

en lugar de

write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv")

Si abro test.csv abre el archivo en Excel. Excel lo convierte en notación científica. Cuando hago clic derecho y abro con el bloc de notas, se ve bien y veo los números originales sin notación científica.


Use bit64 , es una clase S3 para vectores para enteros de 64 bits

library(dplyr) library(readr) options(digits = 22) tbl_df <- data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)) > tbl_df GEOID 1 60150001022000 2 60150001022001 3 60150001022002 4 60150001022003 5 60150001022004 6 60150001022005 library(bit64) tbl_df$GEOID <- as.integer64(tbl_df$GEOID) write_csv(tbl_df,''test.csv'')

Si vuelve a leer estos datos en R, asignará el tipo de datos correcto.

dfr <- read_csv(''test.csv'') > dfr Source: local data frame [6 x 1] GEOID 1 60150001022000 2 60150001022001 3 60150001022002 4 60150001022003 5 60150001022004 6 60150001022005 > str(tbl_df) ''data.frame'': 6 obs. of 1 variable: Classes ‘tbl_df’, ‘tbl’ and ''data.frame'': 6 obs. of 1 variable: $ GEOID: num 6.02e+13 6.02e+13 6.02e+13 6.02e+13 6.02e+13 ...

Espero que esto ayude. Abrí el csv en un editor de texto, los números tenían "" alrededor de ellos. Pero aún funcionaba.


require(dplyr) tbl_df = mutate_if(tbl_df, is.numeric, as.integer)

Creo que sería más seguro recodificar esas columnas en una cadena al exportar el CSV en tal caso