我有一个xts对象,每天有900列(x1-x900),我需要计算每月回报。
x <- data.frame(date=seq(as.Date("2016/7/4"), as.Date("2016/10/1"), "day"),x1=runif(90,.95,1.07),x2=runif(90,.95,1.07),
x3=runif(90,.95,1.07),x4=runif(90,.95,1.07),x5=runif(90,.95,1.07),x6=runif(90,.95,1.07),x7=runif(90,.95,1.07))
以上是我正在使用的数据示例。我需要做的是获取每个月和每列的值的产品,适用于2016年7月31日,2016年8月31日,2016年9月30日等。我不想使用{{ 1}}因为每个月的长度显然不固定。我已经尝试了汇总,聚合,但我没有想到这一点,我试图避免不得不做一个“for”循环。
最终目标是获得zoo::rollapply
,例如:
data.frame
答案 0 :(得分:3)
xts.x <- xts(x[, !colnames(x) %in% "date"], order.by = x[, "date"])
xts.x.mthly <- apply.monthly(xts.x, FUN = function(x) unlist(lapply(x, prod)))
> xts.x.mthly
x1 x2 x3 x4 x5 x6 x7
2016-07-31 0.9924681 1.306556 1.0919181 0.8019117 1.3563864 1.853631 0.8563263
2016-08-31 1.4780971 1.946373 1.4265027 1.8508386 1.4926483 1.651613 1.4224733
2016-09-30 1.5926547 1.478231 1.0414107 1.4204825 1.2540149 1.374734 1.0768668
2016-10-01 1.0643725 1.005987 0.9813467 1.0545426 0.9964061 1.005145 1.0146190
# If you want data.frame output with explicit date column:
df.mthly <- data.frame("date" = index(xts.x.mthly), coredata(xts.x.mthly))
答案 1 :(得分:-1)
以下是包含dplyr
和lubridate
软件包的解决方案:
set.seed(1) ; x <- data.frame(date=seq(as.Date("2016/7/4"), as.Date("2016/10/1"), "day"),x1=runif(90,.95,1.07),x2=runif(90,.95,1.07),
x3=runif(90,.95,1.07),x4=runif(90,.95,1.07),x5=runif(90,.95,1.07),x6=runif(90,.95,1.07),x7=runif(90,.95,1.07))
library(dplyr) ; library(lubridate)
x %>%
group_by(yearmon = paste(year(date), month(date), sep = "-")) %>%
summarise_each(funs(prod), - c(date, yearmon))
它遗漏了您想要获得该月最后一天的部分。希望它仍然有用。
(编辑:对于缺失的部分,这是一个解决方法:
x %>%
group_by(yearmon = paste(year(date), month(date), sep = "-")) %>%
mutate(Date = max(date)) %>%
group_by(Date) %>%
summarise_each(funs(prod), - c(yearmon, date, Date))