我正在使用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>)
注意refIds与搜索到的refId完全匹配的位置,但是在最后一位数字上都是关闭的。有没有办法解决这个问题而不必重新编号id以使它们变小?
答案 0 :(得分:3)
首先,您必须了解那些不是整数。这些是浮点数。
其次,由于1.9.4 data.table
使用二进制搜索进行简单比较线性搜索(如您所拥有的),并使用浮点数进行二分搜索,因此通常需要进行舍入。碰巧的是,默认的舍入级别会使您的ID相等。
您的问题有很多解决方案(按我的偏好顺序列出):使用64位整数,使用字符ID,更改舍入,禁用二级索引/欺骗它。前两个应该是不言自明的,这是最后两个选项:
# 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]