Обновите объект временного ряда XTS данными из другого объекта XTS - PullRequest
0 голосов
/ 12 апреля 2019

Я ищу более простой способ обновления объекта временного ряда XTS с использованием данных в другом объекте XTS.Данные для перекрывающихся периодов времени и измерений должны быть обновлены, дополнительные периоды времени должны быть добавлены, а недостающие измерения ряда должны быть добавлены по мере необходимости.В настоящее время я использую комбинацию слияния, подмножества и назначения.Есть ли способ сделать это за меньшее количество шагов?

Пример

Два объекта серии xts времен с одним общим измерением (y) и двумя общими периодами времени (Q2 2018 и Q3 2018).

library(xts)

t <- as.yearqtr(paste(2018, 1:4, sep = ":Q"), format = "%Y:Q%q")

short <- xts(
    matrix(1, ncol = 2, nrow = 2, dimnames = list(NULL, c("x", "y"))), 
    order.by = t[2:3]
)

long <- xts(
    matrix(0, ncol = 2, nrow = 4, dimnames = list(NULL, c("y", "z"))),
    order.by = t
)

short

        x y
2018 Q2 1 1
2018 Q3 1 1

long

        y z
2018 Q1 0 0
2018 Q2 0 0
2018 Q3 0 0
2018 Q4 0 0

Желаемый результат для случая 1: обновление short с помощью long

         x  y z
2018 Q1 NA  0 0
2018 Q2  1  0 0
2018 Q3  1  0 0
2018 Q4 NA  0 0

Желаемый результат для случая 2: обновить long с помощью short

         x  y z
2018 Q1 NA  0 0
2018 Q2  1  1 0
2018 Q3  1  1 0
2018 Q4 NA  0 0

Случай 1

Объединить неперекрывающиеся измерения, затем поднабор и назначить дляперекрывающиеся измерения (как в: Обновление объекта XTS )

short2 <- short
for (j in setdiff(colnames(long), colnames(short2))) {
    short2 <- merge(short2, long[, j])
}
short3 <- short2
for (j in intersect(colnames(short3), colnames(long))) {
    short3[index(long), j] <- long[, j]
}
short3

         x y z
2018 Q1 NA 0 0
2018 Q2  1 0 0
2018 Q3  1 0 0
2018 Q4 NA 0 0

Случай 2

Тот же подход: объединить для непересекающихся измерений рядов, затем подналожить и назначить дляперекрывающиеся размеры

long2 <- long
for (j in setdiff(colnames(short), colnames(long2))) {
    long2 <- merge(long2, short[, j])
}
long3 <- long2
for (j in intersect(colnames(short), colnames(long3))) {
    long3[index(short), j] <- short[, j]
}
long3

        y z  x
2018 Q1 0 0 NA
2018 Q2 1 0  1
2018 Q3 1 0  1
2018 Q4 0 0 NA

Есть ли что-нибудь попроще, чем этот двухэтапный процесс?Возможно, функция или опция из другого пакета.

1 Ответ

0 голосов
/ 13 апреля 2019

Нет пути от R до merge при назначении приоритетов столбцам с одинаковыми именами.У меня был похожий вопрос некоторое время назад.R должен по умолчанию создавать уникальные имена столбцов.Впоследствии вы можете напрямую присвоить столбцам общее имя, используя setNames, но R всегда будет назначать уникальные имена (см. ?make.names для некоторых пояснений).Однако это не рекомендуется, так как после этого действия будут намного сложнее.

Управление объектами ts и xts также затруднено.Это может быть сделано, но на самом деле не стоит времени.Лучше всего преобразовать в data.frame или tibble и работать в этих форматах, а затем преобразовать обратно.

Ниже приведено решение tidyverse, в котором также используется пакет timetk.

library(xts)
library(timetk)
library(dplyr)

xts::merge.xts(long, short) %>% #merge xts objects using merge.xts
  timetk::tk_tbl() %>% #convert xts object to tibble
  dplyr::mutate(y = dplyr::coalesce(y.1, y)) %>% #replace y with coalesced y & y.1
  dplyr::select(-y.1) %>% #deselect y.1
  timetk::tk_xts(silent = T) #convert back to xts

        y z  x
2018 Q1 0 0 NA
2018 Q2 1 0  1
2018 Q3 1 0  1
2018 Q4 0 0 NA
...