2012-05-22 16 views
10

Estoy tratando de leer un archivo csv que tenga códigos de barras en la primera columna, pero cuando R lo transfiere a un data.frame, convierte "1665535004661" en "1.67E + 12". ¿Hay alguna forma de preservar este número en un formato entero? Traté de asignar una clase de "doble", pero eso no funcionó, ni asignó una clase de "personaje". Una vez que está en el formato 1.67E + 12, cualquier intento de convertirlo a un entero devuelve "167000000000".Preservar números grandes

Gracias, J--

Respuesta

12

no está en un "formato 1.67E + 12", sólo que no se imprimirá en su totalidad utilizando los valores por defecto. R lo está leyendo muy bien y el número entero está allí.

x <- 1665535004661 
> x 
[1] 1.665535e+12 
> print(x, digits = 16) 
[1] 1665535004661 

Ver, los números estuvieron allí todo el tiempo. No se pierden a menos que tengas una gran cantidad de dígitos. La ordenación de lo que trajiste funcionará bien y puedes llamar explícitamente a print() con la opción de dígitos para ver tu data.frame en lugar de implícitamente tecleando el nombre.

+0

Esto básicamente anula el método que analizo a continuación con 'options()'. Como punto de referencia, uno debe leer y prestar atención a la advertencia en '? Print.default' ya que la implementación en> = 16 dígitos comienza a convertirse en un problema específico de la plataforma ya que la implementación de' sprintf() 'comienza a diferir según el código C subyacente. – Chase

+0

Lo mismo es cierto si usa options(). Solo es un valor predeterminado de salida. Creo que sería mejor si fuera explícito al respecto en su respuesta. Como es eso es bastante vago. Al tratar de leerlo ingenuamente, me pregunto si la opción de dígitos simplemente cambia cuántos dígitos se retienen, cómo se leen? ... ¿qué? – John

+0

Buen punto: edité mi respuesta para ser más explícito sobre eso. Siéntase libre de retocar más si lo considera necesario. ¡Aclamaciones! - Chase – Chase

3

miren el paquete int64: Bringing 64-bit data to R.

+0

¿Hay alguna forma de importarlo como personaje? No necesito hacer cálculos con eso, solo tengo que ordenarlo. – James

+0

x <- "1665535004661" –

10

Tomando en consideración lo que ha dicho en los comentarios, puede importar directamente el texto como un carácter especificando el colClasses en read.table(). Por ejemplo:

num <- "1665535004661" 
dat.char <- read.table(text = num, colClasses="character") 
str(dat.char) 
#------ 
'data.frame': 1 obs. of 1 variable: 
$ V1: chr "1665535004661" 
dat.char 
#------ 
      V1 
1 1665535004661 

alternativa (y para otros usos), se puede especificar la variable digits bajo options(). El valor predeterminado es de 7 dígitos y el rango aceptable es de 1-22. Para que quede claro, al configurar esta opción de ninguna manera cambia o altera los datos subyacentes, simplemente controla cómo se muestra en la pantalla cuando se imprime. Desde la página de ayuda para ?options:

controls the number of digits to print when printing numeric values. It is a suggestion only. 
Valid values are 1...22 with default 7. See the note in print.default about values greater than 
15. 

Ejemplo ilustrativo de esto:

options(digits = 7) 
dat<- read.table(text = num) 

dat 
#------ 
      V1 
1 1.665535e+12 

options(digits = 22) 
dat 
#------ 
      V1 
1 1665535004661 

a la carne este completamente y para tener en cuenta los casos en que el establecimiento de un entorno global no es preferible, se puede especificar directamente los dígitos como argumento al print(foo, digits = bar). Puede leer más sobre esto en ?print.default. Esto es lo que John describe en su respuesta, por lo que el crédito debe ir a él para iluminar ese matiz.

4

Desde la página is.integer:?

"Tenga en cuenta que las implementaciones actuales de R utilizar enteros de 32 bits para los vectores de enteros, por lo que el rango de números enteros representables se limita a aproximadamente +/- 2 * 10^9 ?

1665535004661L> 2 * 10^9 [1] VERDADERO

usted quiere el paquete Rmpfr.

library(Rmpfr) 
x <- mpfr(15, precBits= 1024) 
2

Dado que no está realizando operaciones aritméticas en este valor, el carácter es apropiado. Puede usar el argumento colClasses para establecer varias clases para cada columna, que probablemente sea mejor que usar todos los caracteres.

data.csv:

a,b,c 
1001002003003004,2,3 

Leer carácter, entonces los números enteros:

x <- read.csv('test.csv',colClasses=c('character','integer','integer')) 
x 
       a b c 
1 1001002003003004 2 3 


mode(x$a) 
[1] "character" 

mode(x$b) 
[1] "numeric" 
1

Puede usar los argumentos numéricos cuando está haciendo read.csv. Entonces, por ejemplo:

read.csv(x, sep = ";", numerals = c("no.loss")) Where x is your data. 

Esto conserva el valor de los enteros largos y no altera su representación al importar los datos.

Cuestiones relacionadas