我的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
感谢。
答案 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