【问题标题】:Using Dates with the data.table package将日期与 data.table 包一起使用
【发布时间】:2011-10-22 04:19:15
【问题描述】:

我最近发现了 data.table 包,现在想知道是否应该替换我的一些 plyr 代码。总而言之,我真的很喜欢 plyr,我基本上实现了我想要的一切。但是,我的代码运行了一段时间,加快速度的前景足以让我运行一些测试。这些测试很快就结束了,这就是原因。

我经常用 plyr 做的是将我的数据按包含日期的列拆分并进行一些计算:

library(plyr)
DF <-  data.frame(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
#Split up data and apply arbitrary function
ddply(DF, .(Date), function(df){mean(df$y) - df[nrow(df), "y"]})

但是,在 data.table 中使用具有日期格式的列似乎不起作用:

library(data.table)
DT <- data.table(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
setkey(DT, Date)
#Error in setkey(DT, Date) : Column 'Date' cannot be auto converted to integer without losing information.

如果我正确理解了这个包,我只有在使用 setkey() 时才能获得显着的加速。另外,我认为在日期和数字之间不断转换并不是一个好的编码。那么是我遗漏了什么,还是没有简单的方法可以使用 data.table 来实现?

sessionInfo()
R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] C

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.6.3 zoo_1.7-2        lubridate_0.2.5  ggplot2_0.8.9    proto_0.3-9.2    reshape_0.8.4   
[7] reshape2_1.1     xtable_1.5-6     plyr_1.5.2      

loaded via a namespace (and not attached):
[1] digest_0.5.0    lattice_0.19-30 stringr_0.5     tools_2.13.1 

【问题讨论】:

  • 我没有使用过 data.table,但请注意 Sys.time() 返回的是 POSIXct 日期时间值,而不是 Date。特别是,返回的值(自 1970 年 1 月 1 日以来经过的秒数)通常不是整数值,因此转换为整数确实会丢失信息,如错误消息所述
  • 请注意,即使您不使用setkey,data.table 也可以显着缩短执行时间

标签: r datetime data.table plyr


【解决方案1】:

这应该可行:

DT <- data.table(Date=as.ITime(rep(c(Sys.time(), Sys.time() + 60), each=6)),
                 y=c(rnorm(6, 1), rnorm(6, -1)))
setkey(DT, Date)

data.table 包包含一些具有整数存储模式的日期/时间类。 见?IDateTime:

具有整数存储的日期和时间类,用于快速排序和 分组。仍处于实验阶段!

  • IDate 是从 Date 派生的日期类。它具有与Date 类相同的内部表示,除了存储模式是整数。
  • ITime 是一个时间类,存储为一天中的整数秒数。 as.ITime 不允许天数超过 24 小时。因为ITime 是以秒为单位存储的,所以可以将其添加到POSIXct 对象中,但不应将其添加到Date 对象中。
  • IDateTime 接受日期时间输入并返回包含datetime 列的数据表。

【讨论】:

  • 谢谢,这有帮助。我实际上正在使用 lubridate,这反过来又适用于 ggplot2。由于所有三个包(lubridate、ggplot2、plyr)都来自同一个作者,并且组合起来效果很好,我想我会和他们呆久一点而不是进行切换。但是您的回答提供了一个很好的解决方法,当我有时间时,我想我会尝试使用 data.table 测试速度改进。再次感谢!
猜你喜欢
  • 2015-11-01
  • 2014-03-20
  • 2021-08-31
  • 1970-01-01
  • 2017-02-08
  • 2021-10-01
  • 2019-12-17
  • 2012-01-05
  • 1970-01-01
相关资源
最近更新 更多