如何将 R 数据框与非精确条件(大于/小于条件)组合在一起



我必须组合两个具有交易和报价信息的R数据帧。类似于联接,但基于以秒为单位的时间戳。我需要将每笔交易与最新报价相匹配。报价比交易多得多。

我有这个带有股票报价的表格。时间戳以秒为单位:

+--------+-----------+-------+-------+
| Symbol | Timestamp |  bid  |  ask  |
+--------+-----------+-------+-------+
| IBM    |        10 | 132   | 133   |
| IBM    |        20 | 132.5 | 133.3 |
| IBM    |        30 | 132.6 | 132.7 |
+--------+-----------+-------+-------+

这些是交易:

+--------+-----------+----------+-------+
| Symbol | Timestamp | quantity | price |
+--------+-----------+----------+-------+
| IBM    |        25 |      100 | 132.5 |
| IBM    |        31 |       80 | 132.7 |
+--------+-----------+----------+-------+

我认为本机 R 函数或 dplyr 可以做到这一点 - 我已经将两者用于基本目的,但不确定如何在这里进行。有什么想法吗?

所以 25 秒的交易应该与 20 秒的报价匹配,交易 @31 匹配报价 @30,如下所示:

+--------+-----------+----------+-------+-------+-------+
| Symbol | Timestamp | quantity | price |  bid  |  ask  |
+--------+-----------+----------+-------+-------+-------+
| IBM    |        25 |      100 | 132.5 | 132.5 | 133.3 |
| IBM    |        31 |       80 | 132.7 | 132.6 | 132.7 |
+--------+-----------+----------+-------+-------+-------+

考虑以 10 为增量合并计算字段。具体来说,计算两个数据集中 10 的倍数的列,并使用 Symbol 合并该字段。

下面的 transformwithin 用于分配和取消分配帮助程序字段 mult10。在此用例中,这两个基本函数是可互换的:

final_df <- transform(merge(within(quotes, mult10 = floor(Timestamp / 10) * 10),
                            within(trades, mult10 = floor(Timestamp / 10) * 10),
                            by=c("Symbol", "mult10"),
                      multi10 = NULL)

现在,如果 10 倍数不足以满足您的需求,请调整到您需要的水平,例如 15、5、2 等。

within(quotes, mult10 <- floor(Timestamp / 15) * 15)
within(quotes, mult10 <- floor(Timestamp / 5) * 5)
within(quotes, mult10 <- floor(Timestamp / 2) * 2)

更重要的是,您可能需要分别对两个数据集使用反向、floorceiling来计算报价时间戳的最高倍数和交易时间戳的最低倍数:

within(quotes, mult10 <- ceiling(Timestamp / 15) * 15)
within(trades, mult10 <- floor(Timestamp / 5) * 5)

最新更新