R Как разделить данные периоды времени в интервале 30 дней в R - PullRequest
0 голосов
/ 04 июля 2018

У меня есть данные с идентификатором заказа, датой начала и датой окончания. Я должен разделить обе даты начала и окончания на интервалы 30 дней и получить две новые переменные: «дата начала разделения» и «дата окончания разделения» , Пример: В приведенном ниже примере показано, как создаются разделенные даты, когда «Начальная дата» - «01.05.2017», а «Конечная дата» - «06.07.2017». Предположим, что у заказа есть даты начала и окончания, как показано ниже

см. Изображение на примере

Какой код этой проблемы в R?

1 Ответ

0 голосов
/ 04 июля 2018

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