“按引用更新”和滚动连接的组合产生的结果与滚动条件所预期的结果相反

时间:2019-01-15 10:38:53

标签: r data.table

我需要加入两个data.tables并通过引用更新第一个。 data.table A仅包含一个工作日的Date列; data.table B包含一个(所有)日历日期的Date列,该列与第一个data.table覆盖相同的时间段,此外还包含一个Equity列。这两个data.tables均以Date为键。

方法一A [B,Equity:= Equity,on =“ Date”]可以正常工作,因为A中的所有日期都在B中;但是

方法二A [B,Equity:= Equity,roll = + Inf,on =“ Date”]不在星期五和星期五加入,但是星期五和下一个星期日合并,这仅与掷骰条件'roll = -Inf'(NOCB)(在这种情况下,无论如何都应该与上面方法一完全匹配)

方法二A [B,Equity:= Equity,roll = -Inf,on =“ Date”]导致完全连接

在下面的代码中,data.table A = trad.dt和data.table B = cal.dt

library(data.table)
start.date <- as.Date("1997-01-01")
end.date <- as.Date("1997-02-01")
cal.seq <- seq(start.date,end.date,"days")
weekdays.excl <- c("Saturday","Sunday")
trad.seq <- cal.seq[!weekdays(cal.seq) %in% weekdays.excl]
cal.dt <- data.table(Date=cal.seq,Equity=1:length(cal.seq),key="Date")
trad.dt <- data.table(Date=trad.seq,key="Date")
trad.dt.noroll <- copy(trad.dt)
trad.dt.roll <- copy(trad.dt)
trad.dt.noroll[cal.dt,Equity:=Equity,on="Date"]
trad.dt.roll[cal.dt,Equity:=Equity,roll=+Inf,on="Date"]
all.equal(trad.dt.noroll,trad.dt.roll)
trad.dt.comb <- trad.dt.noroll[trad.dt.roll,on="Date"][,roll.minus.noroll:=Equity-i.Equity][,Weekdays:=weekdays(Date)]

我希望无论有无ROLL的两个联接都能产生相同的结果;此外,滚动连接的滚动条件似乎会产生意外的结果

0 个答案:

没有答案