Определите параметры поведения плана пользователя для транзакции подписки в dplyr - PullRequest
0 голосов
/ 27 января 2020

У меня есть df, идентифицирующий пользователей и их повторяющиеся транзакции в бизнес-модели на основе подписки, где транзакции могут происходить в месячном, 3-месячном или 6-месячном цикле (каждые 30, 90, 180 дней соответственно).

library(tidyverse)

df <- tibble::tribble(
        ~user_id,        ~date,      ~plan,   ~order_type,
               1, "12/23/2018",  "monthly", "acquisition",
               1,  "1/22/2019",  "monthly",      "repeat",
               1,  "2/21/2019", "3-months",      "repeat",
               1,  "5/22/2019", "3-months",      "repeat",
               1,  "8/20/2019", "3-months",      "repeat",
               2,  "5/18/2019",  "monthly", "acquisition",
               2,  "6/17/2019",  "monthly",      "repeat",
               2,  "7/17/2019",  "monthly",      "repeat",
               3,  "9/14/2018",  "monthly", "acquisition",
               3, "10/14/2018", "6-months",      "repeat",
               3,  "4/12/2019", "6-months",      "repeat",
               4,  "9/14/2018", "3-months", "acquisition",
               4, "12/13/2018",  "monthly",      "repeat",
               4,  "1/12/2019",  "monthly",      "repeat"
        )

Каждый клиент (идентифицируемый с уникальным user_id) может свободно начинать с любого из этих «планов» и в течение своей подписки может переходить с одного плана на другой.

Моя цель состоит в том, чтобы определить с предпочтением решений Dplyr:

  • Обновления пользователя (а именно, его / его первый заказ (= приобретение) - «ежемесячный», но последующие либо «3 месяца», либо «6 месяцев»)
  • Понижение рейтинга пользователя (а именно, его / его первый заказ (= приобретение) составляет «3 месяца» или «6 месяцев», но последующие "ежемесячно")

Мой желаемый результат:

df_output <- tibble::tribble(
               ~user_id,        ~date,      ~plan,   ~order_type, ~behavior_type,
                      1, "12/23/2018",  "monthly", "acquisition",            "-",
                      1,  "1/22/2019",  "monthly",      "repeat",            "-",
                      1,  "2/21/2019", "3-months",      "repeat",      "upgrade",
                      1,  "5/22/2019", "3-months",      "repeat",            "-",
                      1,  "8/20/2019", "3-months",      "repeat",            "-",
                      2,  "5/18/2019",  "monthly", "acquisition",            "-",
                      2,  "6/17/2019",  "monthly",      "repeat",            "-",
                      2,  "7/17/2019",  "monthly",      "repeat",            "-",
                      3,  "9/14/2018",  "monthly", "acquisition",            "-",
                      3, "10/14/2018", "6-months",      "repeat",      "upgrade",
                      3,  "4/12/2019", "6-months",      "repeat",            "-",
                      4,  "9/14/2018", "3-months", "acquisition",            "-",
                      4, "12/13/2018",  "monthly",      "repeat",    "downgrade",
                      4,  "1/12/2019",  "monthly",      "repeat",            "-"
               )

1 Ответ

0 голосов
/ 27 января 2020

Мы можем сделать это с case_when

library(dplyr)
df %>%
   group_by(user_id) %>% 
   mutate(behavior_type = case_when(grep("monthly", 
        rle(plan)$values[1:2]) == 1 ~ "upgrade",
       TRUE ~ "downgrade"), 
     behavior_type = replace(behavior_type, all(plan == "monthly"), NA))
...