data.table中的值不匹配

时间:2015-07-14 20:22:27

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

注意refIds与搜索到的refId完全匹配的位置,但是在最后一位数字上都是关闭的。有没有办法解决这个问题而不必重新编号id以使它们变小?

1 个答案:

答案 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]