R:用于计算30天内移动总和的循环逻辑

时间:2016-12-14 16:41:01

标签: r loops group-by

我有几个帐户,我正在尝试计算存入的30天存款金额,按帐户分组。我想做这个计算的31次迭代。因此,每个账户将有31笔款项,代表30天的存款总额。

例如,第一次迭代是10/1到10/30的存款,第二次迭代是10/2到10/31 ....然后最终是11/1到11/30,例如。

我的第一个想法是做两个循环,一组按帐户总和计算。

这里有一些样本数据,两个帐户,10和11.第1天到第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
              }  


}

1 个答案:

答案 0 :(得分:3)

您可以使用rollapply中的zoo将移动窗口应用于列。根据要求,我避免使用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)