通过将列名与R中另一个数据帧中存在的分组变量相匹配,对xts对象进行聚合



我有一个时间序列对象,假设:

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对象,但列名将是美国、德国、西班牙的列名。例如,对于美国栏下的某个特定日期,我想要谷歌和苹果在该日期的风险敞口总和。

欢迎任何帮助。

我认为您的原始数据规范存在错误。这是一种方法,先将其从xts格式中移出,然后再重新移入。

数据

我对创建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来转换格式。然后,我们使用dplyrtidyr将数据转换为长格式,在国家/地区将数据加入到每个公司,并在全国范围内进行汇总。然后,我们转换回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

最新更新