Я думаю, что была ошибка с вашей исходной спецификацией данных. Это способ сделать это, сначала переместив его из формата 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