2016-12-14 88 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