Вот решение, которое следует обобщить для нескольких идентификаторов заказов. Я создал образец данных с двумя идентификаторами заказа. Основная идея состоит в том, чтобы вычислить количество интервалов между start_date
и end_date
. Затем мы повторяем строку для каждого идентификатора заказа по количеству интервалов, а также создаем последовательность, чтобы определить, в каком интервале мы находимся. Это цель создания функций 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