在连接期间data.table选择性不匹配处理:LOCF滚动一些列和`na.fill`不同的列

时间:2014-10-04 23:40:47

标签: r data.table

我们有一个不规则的时间序列表,例如买入/卖出交易以及在股票上产生的头寸(这里是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

0 个答案:

没有答案