我有订单ID,开始日期和结束日期的数据。我必须将开始日期和结束日期均分为 30天间隔,并导出两个新变量“开始时间拆分”和“开始时间拆分”结束日期”。 示例:下例说明了开始日期为“ 01/05/2017”且结束日期为“ 06/07/2017”时如何创建拆分日期 假设一个订单的开始日期和结束日期如下
R中解决此问题的代码是什么?
答案 0 :(得分:0)
这里是一个解决方案,应该推广到多个订单ID。我创建了带有两个订单ID的示例数据。基本思想是计算start_date
和end_date
之间的间隔数。然后,我们将每个订单ID的行重复间隔的数量,并创建一个序列来确定我们所处的间隔。这是创建函数f
和g
以及使用Map
。
剩下的只是矢量操作,我们在其中定义了split_start_date
和split_end_date
。最后一条语句是确保split_end_date
不超过end_date
。
df <- data.frame(
order_id = c(1, 2),
start_date = c(as.Date("2017-05-01"), as.Date("2017-08-01")),
end_date = c(as.Date("2017-07-06"), as.Date("2017-09-15"))
)
df$diff_days <- as.integer(df$end_date - df$start_date)
df$num_int <- ceiling(df$diff_days / 30)
f <- function(rowindex) {
rep(rowindex, each = df[rowindex, "num_int"])
}
g <- function(rowindex) {
1:df[rowindex, "num_int"]
}
rowindex_rep <- unlist(Map(f, 1:nrow(df)))
df2 <- df[rowindex_rep, ]
df2$seq <- unlist(Map(g, 1:nrow(df)))
df3 <- df2
df3$split_start_date <- df3$start_date + (df3$seq - 1) * 30
df3$split_end_date <- df3$split_start_date + 29
df3[which(df3$seq == df3$num_int), ]$split_end_date <-
df3[which(df3$seq == df3$num_int), ]$end_date