我有几个帐户,我正在尝试计算存入的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
}
}
答案 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)