使用data.table基于Date对象重塑数据

时间:2014-10-07 15:42:36

标签: r data.table reshape

我使用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

1 个答案:

答案 0 :(得分:1)

感谢您抓住这个,也感谢您提交错误#861。现在已在v1.9.5中修复此问题。来自NEWS

  

.SD中对j的一些优化是在1.9.4中完成的,请参阅#735。由于疏忽,c(lapply(.SD, ...), list(...))形式的j表达式被不正确地优化。这已经修复了。感谢@mmeierer提交#861

那是:

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

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

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

我们计划很快推出下一个版本,并提供一系列快速高优先级的修复程序,以便顺利运行。