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]
我正在使用 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]