如何用dplyr为各订阅服务生成所有月度付款日期?
使用dplyr生成订阅服务的月度付款日期
你可以结合dplyr的行处理功能,搭配lubridate的日期运算函数实现需求。核心逻辑是为每一条订阅数据生成对应数量的月度日期序列,再将序列展开为多行记录。
实现步骤
- 用
rowwise()对每一行数据单独处理 - 借助
lubridate::add_months()生成从首次付款日开始的月度日期序列 - 用
tidyr::unnest()将日期列表展开为多行结构
完整代码示例
首先加载所需工具包:
library(dplyr) library(lubridate) library(tidyr)
构造示例数据框:
subscriptions <- tibble( Subscription = c("Netflix", "Spotify", "PureGym", "DisneyPlus", "AmazonPrime", "Youtube"), MonthlyPayment = c(12.99, 9.99, 19.99, 7.99, 34.99, 12.99), FirstPaymentDate = ymd(c("2021-05-24", "2021-08-17", "2022-07-04", "2020-10-26", "2020-08-11", "2020-09-27")), NumberofPayments = c(21, 7, 9, 11, 73, 35) )
生成付款日期:
payment_dates <- subscriptions %>% rowwise() %>% mutate(PaymentDate = list(add_months(FirstPaymentDate, 0:(NumberofPayments - 1)))) %>% unnest(PaymentDate) %>% ungroup()
结果说明
处理后的数据框会为每个订阅生成对应数量的付款日期行,比如Netflix会生成21行,每行对应一个从2021-05-24开始的月度付款日。如果遇到月末特殊日期(如首次付款日为31号,部分月份无31号),add_months会自动调整为当月最后一天,符合实际订阅付款的常见规则。
内容的提问来源于stack exchange,提问作者b10
相关产品推荐
相关产品推荐

