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