我有一个时间序列对象,假设:
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
来转换格式。然后,我们使用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