У меня есть временной ряд, идентифицирующий заказы в разных циклах «единицы времени».
Каждый заказ может быть:
- Ежемесячно (с 30-дневным циклом)
- 3-месячный (с 90-дневным циклом)
Каждый заказ имеет некоторые определенные c атрибуты - например, расходы и доходы.
Я хочу расширить каждый квартальный заказ в три ежемесячных заказа , сохраняя свои атрибуты только для первого из каждого триплета.
Здесь конкретный c case:
- Каждый
user_id
имеет несколько order_id
s - Каждый
order_id
может быть 1M
(он же ежемесячный, с 30-дневным циклом) или 3M
(он же квартальный, с цикл 90 дней)
введите описание изображения здесь
Итак, вот воспроизводимый пример R.
df_input
имеет несколько заказов для каждого user_id
с их типом (1M для ежемесячных, 3M для 3-месячных заказов) и их атрибуты - доходы и расходы, например.
library(tidyverse)
df_input <-
tibble::tribble(
~user_id, ~order_id, ~plan_type, ~completed_at, ~cycle_days, ~revenues, ~costs,
123, 7000, "1M", "2017-10-04", 30, 12, 7.92,
123, 5083, "1M", "2017-11-03", 30, 13, 8.58,
123, 7636, "3M", "2017-12-03", 90, 23, 15.18,
123, 6355, "3M", "2018-03-03", 90, 24, 15.84,
456, 5316, "1M", "2019-07-10", 30, 10, 6.6,
456, 7139, "1M", "2019-08-09", 30, 11, 7.26,
789, 8422, "3M", "2020-05-25", 90, 22, 14.52,
789, 8426, "3M", "2020-08-23", 90, 23, 15.18
)
В то время как желаемый фрейм данных будет:
df_output <-
tibble::tribble(
~user_id, ~order_id, ~plan_type, ~completed_at, ~cycle_days, ~revenues, ~costs,
123, 7000, "1M", "2017-10-04", 30, 12, 7.92,
123, 5083, "1M", "2017-11-03", 30, 13, 8.58,
123, 7636, "1M", "2017-12-03", 30, 23, 15.18,
123, NA, "1M", "2018-01-02", 30, 0, 0,
123, NA, "1M", "2018-02-01", 30, 0, 0,
123, 6355, "1M", "2018-03-03", 30, 24, 15.84,
123, NA, "1M", "2018-04-02", 30, 0, 0,
123, NA, "1M", "2018-05-02", 30, 0, 0,
456, NA, "1M", "2019-07-10", 30, 10, 6.6,
456, NA, "1M", "2019-08-09", 30, 11, 7.26,
789, 8422, "1M", "2020-05-25", 30, 22, 14.52,
789, NA, "1M", "2020-06-24", 30, 0, 0,
789, NA, "1M", "2020-07-24", 30, 0, 0,
789, 8426, "1M", "2020-08-23", 30, 23, 15.18,
789, NA, "1M", "2020-09-22", 30, 0, 0,
789, NA, "1M", "2020-10-22", 30, 0, 0
)
В df_output
каждый 3M
заказ расширяется на 3 ежемесячных заказа , но для каждой «тройки» только первый заказ имеет доходы и расходы, а остальные имеют просто «0».
Если я сделаю следующее, мне удастся правильно получить расширенные заказы, но не нужные «0» в столбце доходов и расходов ...
df_input %>%
mutate(type2 = as.integer(str_replace(plan_type, "M$", ""))) %>%
mutate(date = ymd(completed_at)) %>%
mutate(dates = map2(date, type2, function(x, y){
seq_num <- 0:(y - 1)
date_seq <- map_chr(seq_num, function(i) as.character(x + days(i * 30)))
return(date_seq)
})) %>%
select(user_id, revenues, costs, date = dates) %>%
unnest(cols = date) %>%
mutate(type = "1M")
Спасибо за вашу помощь!