как объединить R фреймов данных с неточными критериями (больше / меньше, чем условие) - PullRequest
0 голосов
/ 01 февраля 2019

Я должен объединить два фрейма данных 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 |
+--------+-----------+----------+-------+-------+-------+

1 Ответ

0 голосов
/ 01 февраля 2019

Рассмотрите возможность объединения вычисляемого поля с шагом 10. В частности, рассчитайте столбец для кратных 10 в обоих наборах данных и объедините это поле с Символом .

Ниже transform и within используются для назначения и отмены назначения вспомогательного поля, 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)

Более того, вам может понадобиться использовать обратное, floor или ceiling для обоих наборов данных, соответственно, чтобы вычислить наибольшее кратное Отметка времени и минимальное кратное сделки.Отметка времени :

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

within(trades, mult10 <- floor(Timestamp / 5) * 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...