我们有一个不规则的时间序列表,例如买入/卖出交易以及在股票上产生的头寸(这里是Apple):
library(data.table)
txns = data.table(Instrument=rep("AAPL", 3),
Date=as.Date(c("2014-05-10","2014-05-15", "2014-05-20")),
Txn.Qty=c(100, -20, -30), #
key=c("Instrument", "Date"))
txns[, Pos.Qty:=cumsum(Txn.Qty), by="Instrument"]
txns
# Instrument Date Txn.Qty Pos.Qty
# 1: AAPL 2014-05-10 100 100
# 2: AAPL 2014-05-15 -20 80
# 3: AAPL 2014-05-20 -30 50
然后我们想要在第二个(主要是定期的时间序列表)中跟踪头寸(以及可能的每日估值):
positions = data.table(Instrument=rep("AAPL", 13),
Date=as.Date(setdiff(as.Date("2014-05-07") + 1:15,
txns$Date[1:2])), # gaps are possible
key=c("Instrument", "Date"))
out = merge(positions, txns, all=T)
out[!txns, Txn.Qty:=0]
out[, Pos.Qty:=zoo::na.locf(Pos.Qty, na.rm=F), by=Instrument] # `zoo` dependency
out
# Instrument Date Txn.Qty Pos.Qty
# 1: AAPL 2014-05-08 0 NA
# 2: AAPL 2014-05-09 0 NA
# 3: AAPL 2014-05-10 100 100
# 4: AAPL 2014-05-11 0 100
# 5: AAPL 2014-05-12 0 100
# 6: AAPL 2014-05-13 0 100
# 7: AAPL 2014-05-14 0 100
# 8: AAPL 2014-05-15 -20 80
# 9: AAPL 2014-05-16 0 80
# 10: AAPL 2014-05-17 0 80
# 11: AAPL 2014-05-18 0 80
# 12: AAPL 2014-05-19 0 80
# 13: AAPL 2014-05-20 -30 50
# 14: AAPL 2014-05-21 0 50
# 15: AAPL 2014-05-22 0 50
我希望通过一个有效的连接和roll
参数加速上面的操作(即在某些列中向上滚动最后一个观察,用其他列的零填充非连接),仅选择性地执行< em>一些列(类似于.SDcols
哲学)。
是否可以仅在选定列上使用data.table
的{{1}}参数来实现此类操作?
另外,roll
中的其他参数fill
会有所帮助,相当于[.data.table
(我们可以考虑与na.fill
对应的roll
)