data.table连接期间的选择性不匹配处理:LOCF roll某些列和'na.fill'不同列

data.table连接期间的选择性不匹配处理:LOCF roll某些列和'na.fill'不同列,r,data.table,R,Data.table,让我们有一个不规则的时间序列表,例如股票的买入/卖出交易和由此产生的头寸(这里是Apple): 然后,我们希望在第二个主要是常规时间序列表中跟踪头寸(可能还有每日估值): positions = data.table(Instrument=rep("AAPL", 13), Date=as.Date(setdiff(as.Date("2014-05-07") + 1:15, t

让我们有一个不规则的时间序列表,例如股票的买入/卖出交易和由此产生的头寸(这里是Apple):

然后,我们希望在第二个主要是常规时间序列表中跟踪头寸(可能还有每日估值):

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
我希望使用一个高效的join和
roll
参数来加速上述操作(即,在某些列中向前滚动最后一个观察值,在其他列中用零填充非连接),只在某些列上选择性地执行(类似于
.SDcols
原理)

是否可以仅在选定列上使用
data.table
roll
参数来实现类似的功能


另外,在
[.data.table
中添加参数
fill
也会有所帮助,相当于
na.fill
(我们可以考虑
roll
对应于
na.locf

可能重复的?@GSee感谢链接。这是相关的,但情况不同:此Q是关于在两个表的联接过程中处理不匹配项(用零?填充不匹配项,将它们标记为NA?roll locf?,忽略它们?)相比之下,链接的Q在一个表中处理NAs,其中这些NAs可能是也可能不是以前在连接期间不匹配的结果。编辑标题以更好地描述问题。可能与
[.data.table
中的
nomatch
参数更相关。感谢您将其作为FR归档。看起来很有趣,但可能也很难;-)。
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