我需要的是以一種有效的方式完成一些智能na.fill/nomatch的完全外連接。我已經使用循環完成了它,但我想使用矩陣代數或data.table操作來加速此過程。R data.table合併/全外連接與基於公式的na.fill/nomatch基於公式
以下數據是庫存未結訂單信息的樣本,在詢問未結訂單和未結訂單的數據集之間執行完全外連接。數據集是問,B是出價。這兩個數據集都存儲原子順序及其累計和。其任務是通過累計值將所有詢價訂單與出價訂單進行匹配,反之亦然。 填充示例數據:
price = c(11.25,11.26,11.35,12.5,14.2)
amount = c(1.2,0.4,2.75,6.5,15.2)
A <- data.table(ask_price = price, ask_amount = amount, ask_cum_amount = cumsum(amount), cum_value = cumsum(price*amount), ask_avg_price = cumsum(price*amount)/cumsum(amount))
price = c(11.18,11.1,10.55,10.25,9.7)
amount = c(0.15,0.6,10.2,3.5,12)
B <- data.table(bid_price = price, bid_amount = amount, bid_cum_amount = cumsum(amount), cum_value = cumsum(price*amount), bid_avg_price = cumsum(price*amount)/cumsum(amount))
常規的全外連接,它的結果:
setkey(A, cum_value)
setkey(B, cum_value)
C <- merge(A,B,all=TRUE)
print(C)
na.fill/NOMATCH 僞公式,每一行(問或投標),其中cum_value不匹配(請記住,除cum_value以外的其他所有字段均與ask or bid相關):
avg_price["current NA"] <- cum_value["last non NA"]/cum_value["current NA"] * avg_price["last non NA"] + (1-cum_value["last non NA"]/cum_value["current NA"]) * price["next non NA"]
cum_amount["current NA"] <- cum_value["current NA"]/avg_price["current NA"]
預期結果:
D <- data.table(
cum_value = c(1.677,8.337,13.5,18.004,49.2165,115.947,130.4665,151.822,268.222,346.3065),
ask_price = c(NA,NA,11.25,11.26,11.35,NA,12.5,NA,NA,14.2),
ask_amount = c(NA,NA,1.2,0.4,2.75,NA,6.5,NA,NA,15.2),
ask_cum_amount = c(0.149066666666667,0.741066666666667,1.2,1.6,4.35,9.66496172396059,10.85,12.3126600707381,20.4097766460076,26.05),
ask_avg_price = c(11.25,11.25,11.25,11.2525,11.31414,11.9966331281534,12.02456,12.3305605066459,13.1418390633132,13.29392),
bid_price = c(11.18,11.1,NA,NA,NA,10.55,NA,10.25,9.7,NA),
bid_amount = c(0.15,0.6,NA,NA,NA,10.2,NA,3.5,12,NA),
bid_cum_amount = c(0.15,0.75,1.23858478466587,1.66517233847558,4.6230572556498,10.95,12.3652404387114,14.45,26.45,NA),
bid_avg_price = c(11.18,11.116,10.8995364444444,10.8120940902022,10.6458772362927,10.58877,10.5510685899445,10.50671,10.14072,NA)
)
print(D)
注意的是,在預期結果最後NA仍然爲NA,這是因爲相反的順序無法匹配,因爲市場深度不夠滿足不惜任何代價的順序。
是否有可能使用矩陣代數或data.table操作或任何其他有效的方法來避免在整個數據集上循環來獲得預期結果?
在此先感謝
你的公式使用'avg_price'和'price'這兩者都不存在於你的'data.table'中。你能澄清嗎? – Arun
@Arun,計算公式ask_avg_price使用ask_ *,公式計算bid_avg_price使用bid_ *,只有cum_value字段對於兩個集合都是通用的,不應以公式中的詢問/出價爲前綴。 – jangorecki