Сделайте однородным столбец R с разными единицами времени - PullRequest
0 голосов
/ 03 августа 2020

У меня есть временной ряд, идентифицирующий заказы в разных циклах «единицы времени».

Каждый заказ может быть:

  • Ежемесячно (с 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")

Спасибо за вашу помощь!

...