2015-07-20 21 views
3

打算在數據表中添加雙週數日期列。我有一個工作解決方案,但似乎凌亂。另外,我有這種感覺,滾動連接應該做到這一點,但我不知道如何。是否有更好的解決方案來創建雙週日期的分組?雙週數據表分檔

# Mock data table 
dt <- data.table(value = runif(20), date = seq(as.Date("2015-01-01"), as.Date("2015-01-20"), by = "days")) 
# Bi-weekly dates starting with most recent date and working backwards 
bidates <- data.table(bi = seq(dt[, max(date)], dt[, min(date)], by = -14)) 
# Expand out bi-weekly dates to match up with every date in that range 
bidates <- bidates[, seq(bi - 13, bi, by = "days"), by = bi] 
# Key and merge 
setkey(dt, date) 
setkey(bidates, V1) 
dt[bidates, bi := i.bi] 

回答

3

這裏是你如何使用滾動聯接:

bis = dt[, .(date = seq(max(date), min(date), by = -14))][, bi := date] 

setkey(bis, date) 
setkey(dt, date) 

bis[dt, roll = -Inf] 
#   date   bi  value 
# 1: 2015-01-01 2015-01-06 0.2433854 
# 2: 2015-01-02 2015-01-06 0.5454916 
# 3: 2015-01-03 2015-01-06 0.3334531 
# 4: 2015-01-04 2015-01-06 0.9134877 
# 5: 2015-01-05 2015-01-06 0.4557901 
# 6: 2015-01-06 2015-01-06 0.3459536 
# 7: 2015-01-07 2015-01-20 0.8024527 
# 8: 2015-01-08 2015-01-20 0.1833166 
# 9: 2015-01-09 2015-01-20 0.1024560 
#10: 2015-01-10 2015-01-20 0.4052751 
#11: 2015-01-11 2015-01-20 0.9564279 
#12: 2015-01-12 2015-01-20 0.6413953 
#13: 2015-01-13 2015-01-20 0.7614291 
#14: 2015-01-14 2015-01-20 0.2176500 
#15: 2015-01-15 2015-01-20 0.3352939 
#16: 2015-01-16 2015-01-20 0.4847095 
#17: 2015-01-17 2015-01-20 0.8450636 
#18: 2015-01-18 2015-01-20 0.8513685 
#19: 2015-01-19 2015-01-20 0.2012410 
#20: 2015-01-20 2015-01-20 0.3847956 

從版本開始1.9.5+你不需要設置按鍵,可以做:

bis[dt, roll = -Inf, on = 'date']