我最近将data.table从1.8.10升级到1.9.2,并且在跨大整数分组时我发现两个版本之间存在以下差异.
是否有一个我需要在1.9.2中更改的设置,让以下两个组语句中的第一个像在1.8.10中那样工作(我认为1.8.10是正确的行为)?
另外,对于以下两个组语句中的第二个,两个包中的结果是相同的,但是预期的行为是什么?
1.8.10
> library(data.table)
data.table 1.8.10 For help type: help("data.table")
> foo = data.table(i = c(2884199399609098249, 2884199399608934409))
> lapply(foo, class)
$i
[1] "numeric"
> foo
i
1: 2884199399609098240
2: 2884199399608934400
> foo[, .N, by=i]
i N
1: 2884199399609098240 1
2: 2884199399608934400 1
> foo = data.table(i = c(9999999999999999999, 9999999999999999998))
> foo[, .N, by=i]
i N
1: 10000000000000000000 2
>
Run Code Online (Sandbox Code Playgroud)
并且1.9.2
> library(data.table)
data.table 1.9.2 For help type: help("data.table")
> foo = data.table(i = c(2884199399609098249, 2884199399608934409))
> lapply(foo, class) …Run Code Online (Sandbox Code Playgroud) 我注意到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
使用此问题中的相同数据,在data.table v1.9.2中将日期时间舍入到第二个是一个问题.
require(data.table)
options(digits.secs=3) # usually placed in .Rprofile
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")))
DT
DT[ , round(timestamp)] # looks good
DT[ , timestamp_rounded := round(timestamp)] # does not work
DT[ , timestamp_rounded := round(timestamp, units="secs")] # does not work
DT
# timestamp timestamp_rounded
# 1: 2013-01-01 17:51:00.707 1,0,0,24,24
# 2: 2013-01-01 17:51:59.996 51,52,52,54,54
# 3: 2013-01-01 17:52:00.059 17,17,17,17,17
# 4: 2013-01-01 17:54:23.901 1,1,1,1,1
# 5: 2013-01-01 17:54:23.914 0,0,0,0,0
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方案lubridate …