【发布时间】:2019-10-14 06:52:01
【问题描述】:
我有一个数据框,其中包含客户预定的订阅付款,如下所示:
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 中是否有等效的方法,或者是否推荐其他方法?
【问题讨论】: