У меня есть фрейм данных, который состоит из запланированных платежей подписки клиентов следующим образом:
CusID <- c(1,2,3)
FromDate <- c(ymd("2019-01-01"), ymd("2019-01-04"), ymd("2019-02-02"))
ToDate <-c(ymd("2019-01-16"), ymd("2019-01-15"), ymd("2019-04-03"))
Amount <- c(5,10,12)
Frequency <- c("Weekly", "Fortnightly", "Monthly")
Input <- data.frame(CusID, Amount, Frequency, FromDate, ToDate)
Для каждой строки (клиента) я хочу выполнить цикл от FromDate до ToDate и вывести одну строку каждогоданные для каждого запланированного платежа, которые попадают между этими датами, приводя к следующему фрейму данных:
CusID <- c(1,1,1,2,3,3,3)
PaymentDate <- c(ymd("2019-01-01"), ymd("2019-01-08"), ymd("2019-01-15"),
ymd("2019-01-04"),ymd("2019-02-02"),ymd("2019-03-02"),ymd("2019-04-02"))
Amount <- c(5,5,5,10,12,12,12)
Output <- data.frame(CusID, PaymentDate, Amount)
Как эффективный способ добиться этого с использованием R (и предпочтительно с использованием функций dplyr / tidyverse)?
В SAS мой подход заключается в том, чтобы использовать операторы DO / WHILE LOOP и OUTPUT для записи новой строки для каждого запланированного платежа. Например,
data Output;
set Input;
PaymentDate = FromDate;
do while (PaymentDate < ToDate);
Payment = Amount;
PaymentDate = PaymentDate + (7 / 14 / 30 ~ logic based on Frequency);
output;
loop;
run;
(Ключевым моментом в SAS является оператор вывода - он явно записывает новую запись при каждом вызове, поэтому может использоваться в цикле для записи нескольких выходных строк на входную строку).
Есть ли эквивалентный метод, доступный в R, или рекомендуется другой подход?