Агрегирование объекта xts путем сопоставления имен столбцов с переменными группировки, присутствующими в другом кадре данных в R - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть объект временного ряда. Предположим:

library(xts)

exposure <- xts(Google = c(100, 200,300,400,500,600,700,800),
                Apple = c(10, 20,30,40,50,60,70,80),
                Audi = c(1,2,3,4,5,6,7,8),
                BMW = c(1000, 2000,3000,4000,5000,6000,7000,8000),
                AENA = c(50,51,52,53,54,55,56,57,58),
                order.by = Sys.Date() - 1:8) 

У меня есть фрейм данных:

map <- data.frame(Company = c("Google", "Apple", " Audi", "BMW", " AENA"),
                  Country = c("US", "US", " GERMANY", "GERMANY", " SPAIN")) 

Я хочу выполнить агрегацию в объекте подверженности в зависимости от страны, в которую входят компании. нанесены на карту. По сути, мой вывод будет объектом xts с тем же индексом, что и у экспозиции, но имена столбцов будут такими, как в США, ГЕРМАНИИ, ИСПАНИИ. Например, для конкретной даты в столбце США я хотел бы получить сумму рисков для Google и Apple на эту дату.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 05 ноября 2019

Я думаю, что была ошибка с вашей исходной спецификацией данных. Это способ сделать это, сначала переместив его из формата xts, а затем обратно в него.

data

Я сделал несколько изменений в том, как объект xtsсоздано. Я также убрал некоторые ошибочные пробелы.

library(xts)

df <- data.frame(Google = c(100, 200,300,400,500,600,700,800),
                 Apple = c(10, 20,30,40,50,60,70,80),
                 Audi = c(1,2,3,4,5,6,7,8),
                 BMW = c(1000, 2000,3000,4000,5000,6000,7000,8000),
                 AENA = c(50,51,52,53,54,55,56,57)) 

exposure <- xts(df, order.by = Sys.Date() - 1:8)

map <- data.frame(Company = c("Google", "Apple", "Audi", "BMW", "AENA"),
                  Country = c("US", "US", "GERMANY", "GERMANY", "SPAIN"),
                  stringsAsFactors = F)

агрегация

Я использую tbl2xts для преобразования формата. Затем мы используем dplyr и tidyr, чтобы перевести данные в длинный формат, присоединить страну к каждой компании и подвести итоги по стране. Затем мы конвертируем обратно в xts, распределяя данные по странам.

library(tbl2xts)
library(dplyr)
library(tidyr)

xts_tbl(exposure) %>%
  pivot_longer(-date, names_to = "Company") %>%
  left_join(map, by = "Company") %>%
  group_by(date, Country) %>%
  summarize(value = sum(value)) %>%
  ungroup() %>%
  tbl_xts(spread_by = "Country")

результат

           GERMANY SPAIN  US
2019-10-28    8008    57 880
2019-10-29    7007    56 770
2019-10-30    6006    55 660
2019-10-31    5005    54 550
2019-11-01    4004    53 440
2019-11-02    3003    52 330
2019-11-03    2002    51 220
2019-11-04    1001    50 110
...