2014-10-07 36 views
2

我使用data.table來重塑我的數據。但是,更新data.table包後,我的代碼不再工作。使用data.table基於Date對象重塑數據

我基本上想擴展我的數據集基於兩列(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 
+0

我不知道這是如何執行的速度。我在上面使用的命令在數百萬觀察值上進行了測試。 – majom 2014-10-07 15:53:35

+0

對於你目前獲得的結果,「unlist」如何? – A5C1D2H2I1M1N2O1R2T1 2014-10-07 15:57:00

回答

1

感謝捕這一個也是爲了提交bug #861。這現在已在v1.9.5中修復。從NEWS

j.SD一些優化技術在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] 

將工作打算,但速度更快(因爲它是內部優化 - 現在正確)。

我以前的建議是我認爲它應該工作,並實施了優化(這是不正確的)。現在所有的好去:-)。

我們計劃儘快推出下一個版本,並附帶一系列快速高優先級修補程序,以便順利運行。