Как узнать, есть ли у клиента другая указанная c подписка, начинающаяся после более ранней, по дате остановки и дате начала? - PullRequest
3 голосов
/ 13 февраля 2020

Фрейм данных, с которым я работаю, содержит записи о подписках с датой начала и окончания подписки. Пользователь может иметь несколько строк, так как он может иметь или иметь несколько подписок. Я хотел бы знать, сопровождается ли определенной подпиской другая подписка.

Я рассматривал возможность использования для l oop, поскольку количество наблюдений не особенно велико (прибл. 2000). Тем не менее, мои знания по этому предмету не особенно высоки, поэтому я не смог создать его. У каждого пользователя есть свой идентификационный код. Возможны разные типы подписок. Я создал фиктивную переменную для указанной c подписки, которую я хочу проверить, соблюдается ли она.

Пример того, как выглядят данные:

id startdate stopdate subscriptiontype
1   2013-05-01  2013-06-01  1
2   2010-05-02  2012-05-02  3
2   2013-05-02  2013-06-02  1
2   2013-07-23  2013-12-23  2
4   2008-05-02  2011-05-02  3
4   2013-05-04  2013-06-04  1

Я хотел бы видеть для каждого 'id', есть ли другая подписка с начальной датой после конечной даты типа подписки 1. Возможно ли это? Спасибо за чтение!

ДАННЫЕ

structure(list(id = c(1, 2, 2, 2, 4, 4), startdate = structure(c(3L, 
2L, 4L, 6L, 1L, 5L), .Label = c("2008-05-02", "2010-05-02", "2013-05-01", 
"2013-05-02", "2013-05-04", "2013-07-23"), class = "factor"), 
    stopdate = structure(c(3L, 2L, 4L, 6L, 1L, 5L), .Label = c("2011-05-02", 
    "2012-05-02", "2013-06-01", "2013-06-02", "2013-06-04", "2013-12-23"
    ), class = "factor"), subscriptiontype = c(1, 3, 1, 2, 3, 
    1)), class = "data.frame", row.names = c(NA, -6L))

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Я немного изменил ваши данные и сделал следующее. Я думаю, что для каждой группы вы хотите проверить, существует ли какой-либо тип подписки, следующий за типом подписки 1. Сначала я на всякий случай преобразовал два столбца в дату класса. Затем для каждого ID я запускал логические проверки. По сути, я спрашиваю: «Предыдущее значение в subscriptiontype 1?».

library(dplyr)
library(lubridate)

mutate_at(mydf, vars(contains("date")),
          .funs = list(~ymd(.))) %>% 
group_by(id) %>% 
mutate(check = lag(subscriptiontype) == 1)

     id startdate  stopdate   subscriptiontype check
  <int> <date>     <date>                <int> <lgl>
1     1 2013-05-01 2013-06-01                1 NA   
2     2 2010-05-02 2012-05-02                3 NA   
3     2 2013-05-02 2013-06-02                1 FALSE
4     2 2013-07-23 2013-12-23                2 TRUE 
5     4 2008-05-02 2011-05-02                3 NA   
6     4 2013-05-04 2013-06-04                1 FALSE
7     7 2018-01-01 2018-02-01                3 NA   
8     7 2018-03-01 2018-03-15                1 FALSE
9     7 2018-04-01 2018-05-15                4 TRUE 

ДАННЫЕ

mydf <- structure(list(id = c(1L, 2L, 2L, 2L, 4L, 4L, 7L, 7L, 7L), startdate = c("2013-05-01", 
"2010-05-02", "2013-05-02", "2013-07-23", "2008-05-02", "2013-05-04", 
"2018-01-01", "2018-03-01", "2018-04-01"), stopdate = c("2013-06-01", 
"2012-05-02", "2013-06-02", "2013-12-23", "2011-05-02", "2013-06-04", 
"2018-02-01", "2018-03-15", "2018-05-15"), subscriptiontype = c(1L, 
3L, 1L, 2L, 3L, 1L, 3L, 1L, 4L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))

  id  startdate   stopdate subscriptiontype
1  1 2013-05-01 2013-06-01                1
2  2 2010-05-02 2012-05-02                3
3  2 2013-05-02 2013-06-02                1
4  2 2013-07-23 2013-12-23                2
5  4 2008-05-02 2011-05-02                3
6  4 2013-05-04 2013-06-04                1
7  7 2018-01-01 2018-02-01                3
8  7 2018-03-01 2018-03-15                1
9  7 2018-04-01 2018-05-15                4
1 голос
/ 13 февраля 2020

Вы можете самостоятельно присоединиться к столу. Сначала вы фильтруете пользователей по типу подписки «1», а затем присоединяетесь к любому другому типу подписки. Затем вы проверяете, есть ли у пользователя другая подписка (2,3,4), которая начинается после первого окончания. Наконец, вы можете свернуть пользователя, используя «суммирование», чтобы увидеть, выполняются ли наши условия.

    library(dplyr)

    mydf%>%
    filter(subscriptiontype==1)%>%
    full_join(mydf[mydf$subscriptiontype!=1,], by="id", suffix=c(".Type1",".OtherType"))%>%
    mutate(check=as.Date(startdate.OtherType)>=as.Date(stopdate.Type1))%>%
    group_by(id)%>%
    summarise(any(check, na.rm = TRUE))

    id `any(check, na.rm = TRUE)`
    <dbl> <lgl>                     
    1     FALSE                     
    2     TRUE                      
    4     FALSE 
...