2016-12-14 3 views
1

У меня есть несколько учетных записей, и я пытаюсь рассчитать перемещаемую сумму в 30 дней, депонированную, сгруппированную по счету. я хотел бы сделать 31 итерации этого расчета. Таким образом, для каждой учетной записи будет 31 сумма, представляющая 30-дневный период сумм сумм вклада.R: Циклическая логика для вычисления перемещаемой суммы за 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 
       } 


} 

ответ

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

Чувство прекрасное, реальные данные будут полностью заняты. как насчет решения, не использующего dplyr? Я не уверен, как применить эту функцию rollapply к другим функциям группировки. – Rob

+0

Я отредактировал решение, поэтому dplyr больше не требуется. Если вы хотите использовать функции агрегации, которые не являются стандартными, просто напишите свой собственный и укажите его имя для аргумента FUN. До тех пор, пока он принимает вектор значений как свой вход и имеет единственное значение в качестве своего вывода, он должен работать. – mpjdem

+0

Похоже, что сумма идет в обратном направлении, поэтому на выходе 1-го дня текущая сумма для счета 10 должна составлять 117,099, а не 1343. Но я вижу, что на 61-й день складываются правильные суммы, возвращающиеся во времени – Rob

Смежные вопросы