data.table连接期间的选择性不匹配处理:LOCF roll某些列和'na.fill'不同列
让我们有一个不规则的时间序列表,例如股票的买入/卖出交易和由此产生的头寸(这里是Apple): 然后,我们希望在第二个主要是常规时间序列表中跟踪头寸(可能还有每日估值):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
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