data.table包中的大数字类型相等和子集

时间:2016-07-26 05:24:07

标签: r data.table

我使用data.table包进行数据处理。当涉及到大数字时,我注意到了相等和子集的问题。例如:

dt <- data.table(a = c(1, 841026176807, 841026176808))
dt[a==841026176807]
          a
1: 841026176807
2: 841026176808

我认为这是数字类型(双/浮点数的表示)的精度损失,但这有效:

dt[dt$a==841026176807]
          a
1: 841026176807

为什么行为不一致?这是在某处记录还是错误?

2 个答案:

答案 0 :(得分:3)

R的当前实现使用32位整数作为整数向量,因此可重现的整数范围被限制在大约+/- 2 * 10 ^ 9。

如果您想在其上方存储/读取值,则需要将它们存储为64位。

bit64可以处理此问题。

require(bit64) dt <- data.table(a = as.integer64(c(1, 841026176807, 841026176808)))

> dt[a==841026176807]
              a
1: 841026176807

答案 1 :(得分:1)

不同的比较方法在引擎盖下调用不同的函数,其中一些不能处理整数的长度。您可以使用interger64中的bit64来解决此问题,这是在R中处理这些长整数时的标准做法。

require(data.table)
require(bit64)
dt   <- data.table(a = c(1, 841026176807, 841026176808))
dt$a <- as.integer64(dt$a)
dt[a==841026176807]
a
1: 841026176807
dt[dt$a==841026176807]
a
1: 841026176807

无论您使用data.table还是正在执行哪些操作,最好使用intger64或使用此长度的整数重新编码数据,以避免任何意外错误。