我使用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
为什么行为不一致?这是在某处记录还是错误?
答案 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
或使用此长度的整数重新编码数据,以避免任何意外错误。