【问题标题】:Reshaping data based on Date objects using data.table使用 data.table 基于 Date 对象重塑数据
【发布时间】:2014-10-07 15:42:35
【问题描述】:

我使用 data.table 大量重塑我的数据。但是,更新 data.table 包后,我的代码不再工作。

我基本上想基于两列(start.datestop.date)扩展我的数据集。

请看下面的玩具示例:

# Set up toy data
id <- letters[1:3]
start.date <- as.Date(c("2012-01-01", "2012-01-03", "2012-01-05"))
stop.date <- as.Date(c("2012-01-03", "2012-01-06", "2012-01-06"))
d <- data.table(id, start.date, stop.date)

# This is how the input data looks like
#    id start.date  stop.date
# 1:  a 2012-01-01 2012-01-03
# 2:  b 2012-01-03 2012-01-06
# 3:  c 2012-01-05 2012-01-06

# Working code with older version of data.table.
d.new <- d[, c(.SD, list(time=seq(start.date, stop.date, by="days"))), by=id] 

# The result looks like that:
#      id start.date  stop.date                                          V3
# 1:  a 2012-01-01 2012-01-03            2012-01-01,2012-01-02,2012-01-03
# 2:  b 2012-01-03 2012-01-06 2012-01-03,2012-01-04,2012-01-05,2012-01-06
# 3:  c 2012-01-05 2012-01-06                       2012-01-05,2012-01-06

这就是最终数据的样子(并且在更新 data.table 包之前看起来确实如此)

#    id start.date  stop.date time
# 1:  a 2012-01-01 2012-01-03 2012-01-01
# 2:  a 2012-01-01 2012-01-03 2012-01-02
# 3:  a 2012-01-01 2012-01-03 2012-01-03
# 4:  b 2012-01-03 2012-01-06 2012-01-03
# 5:  b 2012-01-03 2012-01-06 2012-01-04
# 6:  b 2012-01-03 2012-01-06 2012-01-05
# 7:  b 2012-01-03 2012-01-06 2012-01-06
# 8:  c 2012-01-05 2012-01-06 2012-01-05
# 9:  c 2012-01-05 2012-01-06 2012-01-06

【问题讨论】:

  • 我不知道这在速度方面的表现如何。我上面使用的命令已经过数百万次观察测试。
  • unlist 你目前得到的结果怎么样?

标签: r data.table reshape


【解决方案1】:

感谢您发现这个问题并提交错误#861。这现在已在 v1.9.5 中修复。来自NEWS

1.9.4 中对j 中的.SD 进行了一些优化,请参阅#735。由于疏忽,c(lapply(.SD, ...), list(...)) 形式的 j 表达式未正确优化。现在已修复。感谢@mmeierer 提交#861

即:

d.new <- d[, c(.SD, list(time=seq(start.date, stop.date, by="days"))), by=id] 

将按预期工作,但速度更快(因为它经过内部优化 - 现在正确)。

我之前的建议是我认为它应该如何工作并实施了该优化(这是不正确的)。现在一切顺利:-)。

我们计划很快推出下一个版本,其中包含一系列快速的高优先级修复,以便顺利运行。

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 2017-11-04
    • 2019-01-10
    • 2018-08-05
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2019-02-28
    相关资源
    最近更新 更多