首页 > 解决方案 > 如何使R在存储时显示19位数字?

问题描述

我有一个带有键列的数据集,它基本上是一个 19 位整数。

我正在使用小标题,所以我options(pillar.sigfig = 22)用来显示更大的数字而不是科学记数法。

问题是,我注意到存储在列中的数字和显示的数字略有不同,具体来说最后 3 位数字不同。

例如

options(pillar.sigfig = 22)
x <- 1099324498500011011

但是当我尝试返回号码时,我得到 1099324498500011 008

我不确定为什么 R 会更改最后 3 位数字,因为它是一个键,它使我的数据无法用于分析。

我已经尝试过通常options(scipen = 999)用于抑制科学记数法的方法,但它似乎不适用于小标题。

如何获得与我打算存储的相同的 19 位数字?

标签: rdataframe

解决方案


很抱歉成为坏消息的承担者,但 R 只有

  • double使用 64 位和大约 16 位小数精度的数字类型 ( )
  • int使用 32 位的整数类型 ( )

没有别的了。您可以强制打印功能向您显示19 位数字,但这仅意味着……您正在查看随机性的三位数字。

(可数)项的 19 位数字很常见,并且通常由(有符号或无符号)int64_t类型提供。哪个 R 本身没有,integer64但通过包中的调用来近似bit64

因此,以下可能是您唯一的解决方法:

> suppressMessages(library(bit64))
> x <- as.integer64("123456790123456789")
> x
integer64
[1] 123456790123456789
> x - 1
integer64
[1] 123456790123456788
> 

好消息是,它得到了许多其他软件包的integer64相当好的支持。data.table

PS它确实是19位数字:

> as.integer64(1.2e18) + 1
integer64
[1] 1200000000000000001
> as.integer64(1.2e19) + 1
integer64
[1] <NA>
Warning message:
In as.integer64.double(1.2e+19) : NAs produced by integer64 overflow
> 

推荐阅读