2016-12-14 84 views
1

我有幾個賬戶,我試圖計算移動30天的存款總額,按賬戶分組。我想做這個計算的31次迭代。因此,每個賬戶將有31筆款項,相當於30天的存款總額。例如,第一次迭代是從10/1到10/30的存款,第二次迭代是10/2到10/31 ....然後最終例如是11/1到11/30。R:循環邏輯來計算移動總和30天

我的第一個想法是做兩個循環,用帳戶和計算一組。

這裏通過61

x <- data.frame(day = c(1:61), 
       account = ifelse(runif(61) <.5, 10, 11), 
       amount = rnorm(61,mean = 100, sd = 10)) 

numinterations<-31 
numsumdays<-30 

monthsums<- for(i in 1:ndays){ 
       for(i in 1:numsumdays){ 
       sum(testloop$daily_total) group by account 
       } 


} 

回答

3

是一些示例數據,兩個賬戶,10和11.存款金額爲1天可以使用rollapplyzoo到移動窗口應用於列。根據要求,我避免使用dplyr。相反,數據幀被分成數據幀列表,最後重新組合。

我笨拙地不得不首先在這裏填寫缺失的日期/賬戶組合,儘管它的工作;可能有一種更優雅的方式來做到這一點。

library(zoo) 

x <- data.frame(day = c(1:61), 
      account = ifelse(runif(61) <.5, 10, 11), 
      amount = rnorm(61,mean = 100, sd = 10)) 

all_combinations <- expand.grid(day=unique(x$day),account=unique(x$account)) 
x <- merge(x, all_combinations, all=TRUE) 
x[is.na(x)] <- 0 

lx <- split(x, x$account) 
for (account in names(lx)) { 
    lx[[account]][['rollingSum']] <- rollapply(lx[[account]][['amount']], width=30, FUN=sum, partial=TRUE, align='right') 
} 
names(lx) <- NULL 
x <- do.call(rbind, lx) 
+0

笨拙很好,真正的數據會被完全佔用。那麼不使用dplyr的解決方案呢?我不知道如何將該rollapply函數應用於其他分組函數 – Rob

+0

我編輯瞭解決方案,因此不再需要dplyr。如果您想使用不標準的聚合函數,只需編寫自己的函數並將其名稱提供給FUN參數。只要它將一個向量值作爲其輸入,並將一個值作爲它的輸出值,它就可以工作。 – mpjdem

+0

看起來總數是倒退的,所以從輸出結果來看,賬戶10的第1天滾動總和應該是117.099,而不是1343.但是我看到,在第61天,正確的總和正在被累加起來。 – Rob