在data.table v1.8.10 vs v1.9.2中对非常小的数字(例如1e-28)和0.0进行分组

use*_*145 4 debugging r frequency data.table

我注意到R中data.table创建的频率表似乎没有区分非常小的数字和零?我可以更改此行为或这是一个错误吗?

可重复的例子:

>library(data.table)   
DT <- data.table(c(0.0000000000000000000000000001,2,9999,0))    
test1 <- as.data.frame(unique(DT[,V1]))   
test2 <-  DT[, .N, by = V1] 
Run Code Online (Sandbox Code Playgroud)

如您所见,频率表(test2)将无法识别0.0000000000000000000000000001和0之间的差异,并将两个观察值放在同一个类中.

Data.table版本:1.8.10
R:3.02

mne*_*nel 5

值得阅读R FAQ 7.31并考虑浮点表示的准确性.

我无法在当前的版本(1.9.2)中重现这一点.运用

R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Run Code Online (Sandbox Code Playgroud)

我猜测行为的变化将与此新闻项目有关.

o数值数据仍然像以前一样在公差范围内连接和分组,但不是公差为sqrt(.Machine $ double.eps)== 1.490116e-08(与base :: all.equal的默认值相同),现在有效数字舍入为最后2个字节,apx 11 sf这更适用于大型(1.23e20)和小型(1.23e-20)数字,并且通过简单的位旋转速度更快.一些函数提供了一个"容差"参数但是没有被传递,所以已被删除.我们的目标是在将来的版本中添加一个全局选项(例如,2个,1个或0个字节的舍入).


马特更新

是,这是在v1.9.2的故意改变和data.table现在区分0.00000000000000000000000000010(如user3340145正确地认为它应该)由于改进的舍入方法从上文所强调NEWS.

我还添加了forRick对测试套件的回答的循环测试.

顺便说一句,#5369现在已在v1.9.3中实现(尽管这个问题都不需要这些):

o bit64 :: integer64现在可用于分组和连接,#5369.感谢James Sams突出UPC.

o新函数setNumericRounding()可用于在加入或分组"numeric"类型的列#5369时减少1个字节或0个字节的舍入.请参阅v1.9.2中的setNumericRounding和NEWS项中的示例.getNumericRounding()返回当前设置.

注意现在是舍入(从v1.9.2的)有关的精度有效数 ; 即有效数字的数量.0.0000000000000000000000000001 == 1.0e-28精确到1平方英尺,所以新的舍入方法不会与此一起分组0.0.

简而言之,问题的答案是:从v1.8.10升级到v1.9.2或更高版本.