У меня есть многоколоночный объект xts, который имеет вторую точность. Затем у меня есть другой объект xts, который содержит одно значение для каждого дня. Я бы хотел добавить это ежедневное значение как столбец в основном объекте xts. Вот пример:Как объединить ежедневные xts в редкие индексированные по времени xts?
Sys.setenv(TZ = "UTC")
library(xts)
set.seed(777)
xt = xts(data.frame(A=1:20,B=201:220,C=round(runif(20)*10,1)),
order.by = as.POSIXct("2015-06-21") + (runif(20) * 86400 * 14))
xd = xts(round(runif(14) - 0.5,1), as.Date("2015-06-21") + (1:14))
Использование merge
не работает: в xd
записи получить дают «00:00:00» метки времени, и поэтому ни один из них не совпадают, так что я получаю объект XTS с большим количеством ВПЛ :
A B C xd
2015-06-21 10:04:36 5 205 7.0 NA
2015-06-22 00:00:00 NA NA NA -0.5
2015-06-23 00:00:00 NA NA NA -0.2
2015-06-23 11:42:38 4 204 10.0 NA
2015-06-24 00:00:00 NA NA NA 0.1
...
Ожидаемый результат:
A B C xd
2015-06-21 10:04:36 5 205 7.0 NA
2015-06-23 11:42:38 4 204 10.0 -0.2
2015-06-24 21:16:18 18 218 8.7 0.1
2015-06-25 02:30:24 15 215 8.7 -0.2
2015-06-25 07:48:42 16 216 1.0 -0.2
2015-06-25 15:04:34 14 214 5.9 -0.2
2015-06-26 07:50:09 1 201 6.9 -0.3
2015-06-27 19:28:33 7 207 3.5 0.5
...
Очки:
- Реальные данные будут намного больше, чем в этом примере, поэтому следует избегать чрезмерного использования памяти и процессора.
- Как показано выше, НС или отсутствующие даты возможны в xd (хотя и относительно редко).
- Есть несколько дней, не представленных в
xt
(как показано отсутствующим выше, чем 2015-06-22). Мне не нужна запись, созданная для таких дней. (Я предполагаю, что я мог бы использоватьna.omit
, чтобы удалить их, но это возможно - и не показано в моем простом примере - что у меня есть некоторые реальные Nas в данных, которые я не хочу удалить.)
ОБНОВЛЕНИЕ: В качестве примера NA
s в исходных данных заблудиться, рассмотрите xt[10,'B'] <- NA
. Используя решение Joshua merge(xt, xd, fill=na.locf)[index(xt)]
, 2015-06-28 19:41:45 заканчивается как 8 203 1.7 0.4
, когда оно должно быть 8 NA 1.7 0.4
. Будет ли это проблемой или нет, будет зависеть от того, что будет xt
. Ответ FXQuantTrader показывает обходное решение для сохранения NA
с использованием магического числа, которое в конце возвращается в NA
. Одна альтернатива (которая использует больше памяти) заключается в том, чтобы взять копию любых столбцов, содержащих НС, и затем заменить весь столбец.
Кстати, мой «избежать чрезмерной памяти» точка была по отношению к идее я (кратко) пришлось использовать '' na.locf' и seq' создать одну запись для каждой второй в 'xd', так что слияние будет работать (например, http://stackoverflow.com/a/8981517/841830). Это потребует 86 400 столько строк (и становится еще глуже, если 'xt' использует миллисекунды)! –