我使用data.table来重塑我的数据。但是,在更新data.table包后,我的代码不再起作用了。
我基本上想要根据两列(start.date
和stop.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
答案 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]
将按预期工作,但速度更快(因为内部优化 - 现在正确)。
我之前的建议是我认为它应该如何工作并实施了优化(这是不正确的)。现在一切都好了:-)。
我们计划很快推出下一个版本,并提供一系列快速高优先级的修复程序,以便顺利运行。