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

时间:2016-10-25 21:05:17

标签: r merge 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)

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

相反,我得到:

             ID colA colB
1: 400000000000    a    b
2: 400000000000    a    b
3: 400000000001    a    b
4: 400000000001    a    b

在某一点上,看起来R停止读取这些整数以用于计算目的。 right_join()中的dplyr似乎没有这个特殊问题,在这种情况下,保持data.table类对我来说并不重要。 ..但我仍然有兴趣知道它是否可以避免以及为什么会出现这种限制(以及为什么join()会避免它)。

1 个答案:

答案 0 :(得分:4)

来自merge文档:

  

数字列上的合并:数字类型的列(即双精度数)   在计算顺序时,将最后两个字节四舍五入   defalult,以避免由于限制而导致的任何意外行为   精确表示浮点数。对于大数字   (整数> 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