2016-10-13 10 views
1

xtsオブジェクトには毎月の900列(x1-x900)の値があり、毎月の返品を計算する必要があります。月ごとに製品別に値を集計するXTSオブジェクトをR

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)) 

上記は私が扱っているデータのサンプルです。私がする必要があるのは、毎月の値と各列の値を、2011年7月31日、2011年8月31日、2010年9月30日などに得ることです。zoo::rollapplyを使用したくない各月の長さは明らかに固定されていません。要約、集計を試みましたが、これを理解していないので、「for」ループを実行する必要がありません。

最終目標はdata.frameのような得ることである。ここでは

Date  x1  x2  x3  x4 
7/31/16 1.03 0.98 1.01  1.03 
8/31/16 1.01 0.95 1.03  1.01 
9/30/16 0.97 1.02 0.94  0.98 
10/31/16 0.99 0.98 1.01  1.04 

答えて

-1

dplyrlubridateパッケージとソリューションです:

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)) 
+0

そして、欠品のため:http://stackoverflow.com/questions/8333838/how-do-you- 2年後の月の最後の日を生成する –

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

私のソリューションとFXQuantTraderの間を簡単に比較すると、間違いなく彼の方がはるかに高速です(約4 (%)) 'library(microbenchmark); マイクロベンチマーク(Apom = { x%>% group_by(yearmon =ペースト(年(日)、月(日付)、sep =" - "))%>% のmutate(日= MAX(日付))%>% GROUP_BY(日)%>% summarise_each(低速運行(PROD)、 - C(yearmon、日付、日)) }、 FXQuantTrader = { xts.x (xts.x、FUN = function(x)unlist(lapply)); - xts(x [、x]、[日付]]のorder.by = x [ (x、prod))) }) ' –

関連する問題