data.table v1.9.2中的POSIXct舍入毫秒(1.8.10中的确定)

时间:2014-03-12 15:55:08

标签: r duplicates data.table

我的data.table v1.9.2:

有一个奇怪的结果
DT
                 timestamp
1: 2013-01-01 17:51:00.707
2: 2013-01-01 17:51:59.996
3: 2013-01-01 17:52:00.059
4: 2013-01-01 17:54:23.901
5: 2013-01-01 17:54:23.914

str(DT)
Classes ‘data.table’ and 'data.frame':  5 obs. of  1 variable:
 $ timestamp: POSIXct, format: "2013-01-01 17:51:00.707" "2013-01-01 17:51:59.996" "2013-01-01 17:52:00.059" "2013-01-01 17:54:23.901" ...
 - attr(*, "sorted")= chr "timestamp"
 - attr(*, ".internal.selfref")=<externalptr> 

当我应用duplicated()函数时,我得到以下结果:

duplicated(DT)
[1] FALSE FALSE FALSE FALSE  TRUE

让第5行等于第4行是很奇怪的。 这也阻止我加入R中的表。是否与POSIXct类型有关?

skydrive上的DT:DT

感谢。

1 个答案:

答案 0 :(得分:2)

是的我用v1.9.2复制了你的结果。

library(data.table)

DT <- data.table(timestamp=c(as.POSIXct("2013-01-01 17:51:00.707"),
                             as.POSIXct("2013-01-01 17:51:59.996"),
                             as.POSIXct("2013-01-01 17:52:00.059"),
                             as.POSIXct("2013-01-01 17:54:23.901"),
                             as.POSIXct("2013-01-01 17:54:23.914")))

options(digits.secs=3)  # usually placed in .Rprofile

DT
                 timestamp
1: 2013-01-01 17:51:00.707
2: 2013-01-01 17:51:59.996
3: 2013-01-01 17:52:00.059
4: 2013-01-01 17:54:23.901
5: 2013-01-01 17:54:23.914

duplicated(DT)
## [1] FALSE FALSE FALSE FALSE TRUE

从Matt的v1.9.3更新

v1.9.2中的舍入发生了变化,影响了毫秒的POSIXct。更多信息:

Grouping very small numbers (e.g. 1e-28) and 0.0 in data.table v1.8.10 vs v1.9.2

Large integers in data.table. Grouping results different in 1.9.2 compared to 1.8.10

因此,v1.9.3中现在提供的解决方法是:

> setNumericRounding(1)   # default is 2
> duplicated(DT)
[1] FALSE FALSE FALSE FALSE FALSE

希望你理解改变的原因并同意我们正朝着正确的方向前进。

当然,您不必致电setNumericRounding(),这只是一种解决方法。

我在追踪器上提交了一个新项目:

#5445 numeric rounding should be 0 or 1 automatically for POSIXct