data.table 中的值匹配不准确

Inaccurate value matching in data.table

我正在使用 data.table (data.table_1.9.4) 包并注意到它在搜索中错误地匹配大整数。比如我用

edgelist_subs[refId==511342051002]

并得到以下响应

structure(list(A1 = c(108885L, 206052L, 202L, 108885L, 206052L, 
222217L, 206052L, 202L, 108885L, 206052L, 206052L, 206052L, 485681L
), A2 = c(202L, 202L, 8654L, 8654L, 8654L, 8654L, 108885L, 222217L, 
222217L, 222217L, 485681L, 531081L, 531081L), refId = c(511342051002, 
511342051002, 511342051002, 511342051002, 511342051002, 511342051002, 
511342051002, 511342051002, 511342051002, 511342051002, 511342051003, 
511342051003, 511342051003), year = c(2013L, 2013L, 2013L, 2013L, 
2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L
)), .Names = c("A1", "A2", "refId", "year"), sorted = c("A2", 
"A1"), class = c("data.table", "data.frame"), row.names = c(NA, 
-13L), .internal.selfref = <pointer: 0x2f54de8>)

请注意 refId 与搜索到的 refId 不完全匹配,但在最后一位数字上全部关闭。有什么办法可以解决这个问题,而不必重新编号以缩小 ID?

首先,您必须了解这些 不是 整数。这些是浮点数。

其次,自 1.9.4 data.table 使用二进制搜索进行简单的比较线性搜索,就像您拥有的那样,并且要使用浮点数进行二进制搜索,您通常需要进行一些舍入。碰巧默认的舍入级别使您的 ID 相等。

您的问题有很多解决方案(按我的优先顺序列出):使用 64 位整数、使用字符 ID、更改舍入、禁用辅助 indexing/trick 它。前两个应该是不言自明的,这里是最后两个选项:

# disabling secondary indexing, by making expression more complicated
# or directly change the option - options(datatable.auto.index=FALSE)
dt[TRUE & refId == 511342051002]

# adjust rounding (default is 2)
setNumericRounding(1)
dt[refId == 511342051002]