2016-08-17 41 views
-1

在我的数据中,我有一列包含类似以下数字的长整数值:1469533935218 当我将其转换为数值时,它将丢失它的信息并成为如下数字: 1.469534e+12如何将数字转换为数字而不丢失信息R

+0

尝试'选项(scipen = 999)'? –

回答

0

当您将其转换为数字时,您没有丢失信息。见options("digits")。这只是一个印刷问题。尝试设置options(digits = 20),然后在控制台中键入1469533935218

当你在控制台输入1469533935218L(后缀L告诉R您想要一个integer而非double)你:

[1] 1.469534e+12 
Warning message: 
non-integer value 1469533935218L qualified with L; using numeric value 

因为这样的整数未在32位模式下无法表示。的?integer的“详细资料”部分给出了:

Integer vectors exist so that data can be passed to C or Fortran 
code which expects them, and so that (small) integer data can be 
represented exactly and compactly. 

Note that current implementations of R use 32-bit integers for 
integer vectors, so the range of representable integers is 
restricted to about +/-2*10^9: ‘double’s can hold much larger 
integers exactly. 

非常最后一句还告诉你,没有精度损失。


如果你想保持1469533935218为整数,则需要@用64位表示akrun的建议,只要你是一个64位机采用了64位的河上,但我的感觉是没有必要这样做。

您还需要记住存储成本。如果保留数据为double,则每个数字仍为32位;如果将数据保存为64位整数,则会增加内存使用量。事实上,如果您稍后使用这些数字执行浮点计算,则需要在double模式下使用它们。那么为什么不使用double

0

如果我们需要阅读与具有大整数列的数据集,使用fread

library(bit64) 
library(data.table) 
dt1 <- fread("yourfile.csv") 

,或者使用可重复的例子

之前装入
dt2 <- fread(" 
     1469533935218,1469533935219 
     14695339352223,1469533935323 
    ") 
dt2 
#    V1   V2 
#1: 1469533935218 1469533935219 
#2: 14695339352223 1469533935323 
+0

您不需要为'fread'调用'library(bit64)'来正确读取它(默认情况下是这样),但它可能更适合打印 –

+0

。从文档:'“integer64”(默认)读取检测为包含整数大于2^31的列为类型bit64 :: integer64。' –

+0

@docendodiscimus我有一个大的事务数据集,我用'fread'读取了某个时间, ID是非常长的整数。我认为它会正确拾取,但是当我检查模糊时,出现了一些问题。所以,我用'bit64'再次读了它,并得到了解决。 – akrun

相关问题