为什么合并 data.tables 对于 R 中的长数字键不起作用,以及避免的方法?

i.M*_*Mik 4 merge r data.table

我正在处理的数据集有一些相当长的 ID。在没有得到我预期的结果后,我将问题追溯到合并两个数据表的代码步骤。

例子:

options("scipen" = 999) ## The only way I know to disable scientific notation.
library(data.table)
table1 <- data.table("ID" = sample(400000000000:400000000004, size = 5), 
                     "colA" = rep('a', 5))
table2 <- data.table("ID" = sample(400000000000:400000000001, size = 2), 
                     "colB" = rep('b', 2))
merge(table1, table2, by = "ID", all.x = F)
Run Code Online (Sandbox Code Playgroud)

由于每个表中的每个 ID 都是唯一的,因此我希望输出长度为两行(仅返回table2due to的匹配行all.x = F)。

相反,我得到:

             ID colA colB
1: 400000000000    a    b
2: 400000000000    a    b
3: 400000000001    a    b
4: 400000000001    a    b
Run Code Online (Sandbox Code Playgroud)

在某个时刻,看起来 R 会停止将这些整数读取为不同的以进行计算。看起来right_join()没有dplyr这个特殊的问题,在这种情况下,对我来说保持班级并不重要data.table......但我仍然有兴趣知道它是否可以避免以及为什么会出现这种限制(以及为什么join()要避免它)。

Hub*_*rtL 5

来自merge文档:

数字列的合并:默认情况下,数字类型(即 double)的列在计算顺序时对其最后两个字节进行四舍五入,以避免由于精确表示浮点数的限制而导致任何意外行为。对于大数字(整数 > 2^31),我们建议使用 bit64::integer64。查看 setNumericRounding 以了解更多信息。

这里的解决方案是使用

setNumericRounding(0)
merge(table1, table2, by = "ID", all.x = F)
             ID colA colB
1: 400000000000    a    b
2: 400000000001    a    b
Run Code Online (Sandbox Code Playgroud)