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

R data.table包中的大数值类型相等和子集,r,data.table,R,Data.table,我正在使用data.table包进行数据处理。我注意到当涉及大量数据时,等式和子集的问题。例: dt <- data.table(a = c(1, 841026176807, 841026176808)) dt[a==841026176807] a 1: 841026176807 2: 841026176808 为什么行为不一致?这是在什么地方记录的还是bug?不同的比较方法调用不同的函数,其中一些方法无法处理整数的长度。您可以使用bit64中的interger64来

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

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

为什么行为不一致?这是在什么地方记录的还是bug?

不同的比较方法调用不同的函数,其中一些方法无法处理整数的长度。您可以使用
bit64
中的
interger64
来克服这一问题,这是在R中处理这些长整数时的标准做法

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

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

不同的比较方法调用不同的函数,其中一些方法无法处理整数的长度。您可以使用
bit64
中的
interger64
来克服这一问题,这是在R中处理这些长整数时的标准做法

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

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

R的当前实现对整数向量使用32位整数,因此,可再现整数的范围被限制在+/-2*10^9左右

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

bit64
可以处理此问题

require(位64)

dtR的当前实现使用32位整数作为整数向量,因此可表示整数的范围限制在+/-2*10^9左右

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

bit64
可以处理此问题

require(位64)


dt
841026176807>.Machine$integer.max#[1]TRUE
,但尽管如此,我认为在R对53位整数的新使用中增加的精度应该已经开始发挥作用。有时数据输入需要使用字符值,但控制台操作不需要使用字符值。这是由于数值类型的最后2个字节的默认舍入,以避免浮点不准确,如
?setNumericRounding
中所述。此行为现在恢复为正常行为(即不再舍入)。。在.
841026176807>机器$integer.max#[1]TRUE中
,但尽管如此,我认为在R对53位整数的新使用中增加的精度应该已经开始发挥作用。有时数据输入需要使用字符值,但控制台操作不需要使用字符值。这是由于数值类型的最后2个字节的默认舍入,以避免浮点不准确,如
?setNumericRounding
中所述。此行为现在恢复为正常行为(即不再舍入)。。在投票中,我投了赞成票,但第一句是错误的。请了解R的能力并纠正错误信息。机器$integer.max不再表示“整数精度”的上限,尽管它仍然限制向量和矩阵的最大维数。@42请参阅R中的“整数”的“帮助”部分。我编写的解决方案的第一行就是从那里引用的。是的,我可能需要接受R方面的教育,因为我知道我不是专家。这是一个合理的参考开始。它还说:“double可以精确地保存更大的整数。”帮助页面的索引方式在这里似乎不是很有用,尽管我认为这些信息曾在其中发布过。我引用了一条新闻:并在3.0版做出更改时更新了先前的答案:并且:在R中,
1
是“数值”(“double”)类型,而不是整数类型的
1L
。我投了更高的票,但第一句话是错误的。请了解R的能力并纠正错误信息。机器$integer.max不再表示“整数精度”的上限,尽管它仍然限制向量和矩阵的最大维数。@42请参阅R中的“整数”的“帮助”部分。我编写的解决方案的第一行就是从那里引用的。是的,我可能需要接受R方面的教育,因为我知道我不是专家。这是一个合理的参考开始。它还说:“double可以精确地保存更大的整数。”帮助页面的索引方式在这里似乎不是很有用,尽管我认为这些信息曾在其中发布过。我引用了一条新闻:并在3.0版做出更改时更新了早期的答案:并且:在R中,
1
是“数值”(“double”)类型,而不是
1L
,后者是整数类型。我怀疑我们看到的是重复的,这就是你所说的“引擎盖下的差异”的意思?不管怎么说,我昨天更新到了最新的devel版本,现在看不到OP的行为,所以我自己也无法真正理解它。@Frank,我们最近删除了2字节舍入功能(因为人们似乎不像我们建议的那样阅读手册和使用
integer64
。@看一看新闻。@Frank我的意思是,从经验上讲,幕后有一些不同的东西,否则这种行为就不存在了。我不自称知道它是什么。我只知道使用
integer64
是最好的实践。)或者这种类型的数据解决了问题。我怀疑我们看到的是一个副本,这就是你所说的隐藏差异的意思?无论如何,我昨天更新到了最新的devel版本,现在看不到OP的行为,所以我自己无法真正弄清楚。@Frank,我们最近删除了2字节舍入功能(因为人们似乎没有像我们建议的那样阅读手册和使用integer64,
。。只要看看新闻就可以了。@Fra
a
1: 841026176807
dt[dt$a==841026176807]
a
1: 841026176807
> dt[a==841026176807]
              a
1: 841026176807