【发布时间】:2019-04-16 22:30:32
【问题描述】:
我觉得我处于正确答案的领域,但对于我的一生,我无法弄清楚如何做到这一点。我想在产品分类帐上输入一个条目并更改数据的形状,其中我在产品交易的每个生命月都有一行/案例。
请注意,有时这些分类帐条目会被冲销/退款(并且 date_from > date_thru)。我在下面的数据框中有一个新购买和退款的示例。此外,交易日期已预先清理为始终是交易日期的第一天,因为我只关心每月的每月经常性收入 (mrr)。
样本df:
user <- c("1001", "1002")
line_item <- c("abc123", "def456")
date_from <- as.Date(c("2015-01-01", "2015-06-01"), "%Y-%m-%d")
date_thru <- as.Date(c("2015-04-01", "2014-12-01"), "%Y-%m-%d")
mrr <- c(2.22, -4.44)
df <- cbind.data.frame(user, line_item, date_from, date_thru, mrr)
输出:
user line_item date_from date_thru mrr
1 1001 abc123 2015-01-01 2015-04-01 2.22
2 1002 def456 2015-06-01 2014-12-01 -4.44
想要的结果:
user line_item month mrr
1001 abc123 2015-01-01 2.22
1001 abc123 2015-02-01 2.22
1001 abc123 2015-03-01 2.22
1001 abc123 2015-04-01 2.22
1002 def456 2015-06-01 -4.44
1002 def456 2015-05-01 -4.44
1002 def456 2015-04-01 -4.44
1002 def456 2015-02-01 -4.44
1002 def456 2015-01-01 -4.44
1002 def456 2014-12-01 -4.44
如何通过矢量化 seq(date_from, date_thru, by="months") 之类的函数来创建一个新的 month 列,然后像上面一样将所有结果向量再次连接到一个 df 中?
我一直在尝试 lapply、dplyr::mutate 和 seq,但无法让它们一起正常工作。
提前致谢!
【问题讨论】:
-
@Shree 是的,这是正确的,这是一个颠倒的
line_item的例子。反转的 lineitem 具有负值,并且 date_thru 在 date_from 之前(有点像负日期范围)。 -
我认为您在所需的输出中缺少用户
1002的日期2015-03-01 -
你应该重新定义
seq.Date函数,让它优雅地接受正负序列。