2016-01-18 18 views
2

什麼是2015年每天之前查找最新「值」的最有效方法,按(loc.x,loc.y)對分組?重複滾動連接,無循環

dt <- data.table( 
    loc.x = as.integer(c(1, 1, 3, 1, 3, 1)), 
    loc.y = as.integer(c(1, 2, 1, 2, 1, 2)), 
    time = as.IDate(c("2015-03-11", "2015-05-10", "2015-09-27", 
        "2015-12-31", "2014-09-13", "2015-08-19")), 
    value = letters[1:6] 
) 
setkey(dt, loc.x, loc.y, time) 

所需的輸出:

loc.x loc.y 2015-01-01 ... 2015-12-31 
1:  1  1   NA    a 
2:  1  2   NA    f 
3:  3  1   e    c 
+0

嘗試'shift',它接受矢量輸入以一次生成多個列 – jangorecki

回答

2

你可以在loc.xloc.y創建於2015年,所有日期和唯一值的查找表使用CJ,然後運行一個滾動聯同dcast結合。

Lookup <- do.call(CJ, c(unique = TRUE, 
         as.list(dt[, .(loc.x, loc.y)]), 
         list(time = seq(as.IDate("2015-01-01"), 
             as.IDate("2015-12-31"), 
             by = "day")))) 


dcast(dt[Lookup, roll = TRUE, nomatch = 0L], loc.x + loc.y ~ time, value.var = "value") 

# loc.x loc.y 2015-01-01 2015-01-02 2015-01-03 
# 1:  1  1   NA   NA   NA 
# 2:  1  2   NA   NA   NA 
# 3:  3  1   e   e   e ... (truncated) 

# 2015-12-26 2015-12-27 2015-12-28 2015-12-29 2015-12-30 2015-12-31 
# 1:   a   a   a   a   a   a 
# 2:   f   f   f   f   f   d 
# 3:   c   c   c   c   c   c