2017-06-26 6 views
1

Ceci est l'erreur la plus bizarre, il semble que read.csv/read.table modifie la valeur d'un certain nombre quand il est trop grandread.csv/read.table l'évolution des valeurs numériques

read.table(text="a,b 
1123363730,5000000000000011111",sep=",",header=TRUE) 
#   a     b 
# 1 1123363730 5000000000000011264 

la valeur de b modifié!

read.table(text="a,b 
1123363730,5000000000000011111",sep=",") 
#   V1     V2 
# 1   a     b 
# 2 1123363730 5000000000000011111 

Maintenant, la valeur est correcte (en tant que chaîne)

Je suppose qu'il doit faire avec le nombre étant de grand, mais il est très ennuyeux, comment puis-je vous assurer que je charge ce qui est dans mon csv ?

+0

probablement un double de [ce] (https://stackoverflow.com/q/32339636/324364). – joran

+0

Peut-être utiliser [bit64] (https://cran.r-project.org/web/packages/bit64/bit64.pdf) et spécifier 'colCasses' dans' read.table' comme 'integer64'? – Lyngbakr

+0

la réponse était en fait aussi simple que cela (pas dans le lien proposé pour dupliquer): 'read.table (text =" 5000000000000011111 ", numerals =" no.loss ")' –

Répondre

1

Vous essayez d'importer un entier trop grand - il sera arrondi et exprimé en notation scientifique.

Vous pouvez voir l'effet d'aller au-dessus du nombre entier maximal de 1:

> str(.Machine$integer.max) 
int 2147483647 
> str(.Machine$integer.max + 1) 
num 2.15e+09 

Je crois cet entier maximal est unique à chaque machine unique et configuration R (s'il vous plaît quelqu'un me corriger si je me trompe).

0
library(bit64) 

tst <- read.table(text="a,b 
        1123363730,5000000000000011111",sep=",", 
        header=TRUE, colClasses = "integer64") 

print(tst$b) 
+0

J'ai ajouté un seul zéro supplémentaire à cela et il a échoué et a donné une valeur par défaut de 9223372036854775807. Cette même valeur est donnée pour tous les zéros supplémentaires ajoutés. C'est le plus grand nombre de 64 bits. – akaDrHouse