Найти повторный идентификатор пользователя в будущем таймфрейме (в R) - PullRequest
0 голосов
/ 17 марта 2019

У меня есть таблица для идентификаторов пользователей и учетных записей, которая работает с 2017-01-01 по 2018-05-01. Это нечасто, поэтому я хочу посмотреть, будут ли они регистрироваться +/- 45 дней одной и той же даты каждый год (в приведенном ниже коде я использовал 320/410, я уточню даты позже, если в этом нет необходимости).

loginID     userID     date
1           a          2017-01-03
2           b          2017-01-12
3           c          2017-01-14
4           d          2017-01-19
5           d          2017-10-18
6           a          2017-11-30
7           b          2017-12-09
8           c          2017-12-17
9           a          2017-12-30
10          b          2018-01-15

Я пытаюсь написать цикл, в котором таблица ссылается на себя. Лучшее, что у меня есть (не работает, но через несколько попыток):

for (row in 1:nrow(df)){
    target <- subset(df, date < (row$date+410))
    target <- subset(target, date > (row$date+320))
    target <- target$userID
    df$ninety <- row$userID %in% target
}

Результаты, которые я ищу:

loginID     userID     date         repeat_oneyr
1           a          2017-01-03   TRUE
2           b          2017-01-12   TRUE
3           c          2017-01-14   TRUE
4           d          2017-01-19   FALSE
5           d          2017-10-18   FALSE
6           a          2017-11-30   FALSE
7           b          2017-12-09   FALSE
8           c          2017-12-17   FALSE
9           a          2017-12-30   FALSE
10          b          2018-01-15   FALSE

(Причина, по которой все после / включая 2017-10-18 - ЛОЖЬ, заключается в том, что у нас нет данных для входа в систему, чтобы показать, вошли ли они в систему в период между 320 и 410 днями с тех пор).

Я знаю (из других вопросов / ответов SO), что если я могу получить TRUE / FALSE, повторяемый для каждого loginID, я могу использовать match() для объединения фреймов данных, поэтому я не беспокоюсь об этой части - это получить ИСТИНА / ЛОЖЬ в первую очередь.

Любые советы приветствуются / приветствуются.

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Вот подход dplyr:

library(dplyr)

df %>% 
  group_by(userID) %>%
  mutate(date = as.Date(date),
         l45 = lead(between(c(0, diff.Date(date)), 320, 410), default = FALSE))

# A tibble: 10 x 4
# Groups:   userID [4]
   loginID userID date       l45  
     <int> <fct>  <date>     <lgl>
 1       1 a      2017-01-03 TRUE 
 2       2 b      2017-01-12 TRUE 
 3       3 c      2017-01-14 TRUE 
 4       4 d      2017-01-19 FALSE
 5       5 d      2017-10-18 FALSE
 6       6 a      2017-11-30 FALSE
 7       7 b      2017-12-09 FALSE
 8       8 c      2017-12-17 FALSE
 9       9 a      2017-12-30 FALSE
10      10 b      2018-01-15 FALSE
0 голосов
/ 17 марта 2019

Вот что вы можете сделать с data.table. Сначала я заказываю data.table по userID. Во-вторых, я преобразовываю столбец даты в объект даты. В-третьих, я создаю столбец fwd_date, используя shift(, type="lead"). Наконец, я использую ifelse для создания столбца repeat_oneyr.

library(data.table)
setDT(df)
setorder(df,userID)
df[,date:=as.Date(df$date)]
df[,fwd_date:=shift(date,type="lead"),by=userID]
df[,repeat_oneyr:=ifelse( (fwd_date-date < 410 & fwd_date-date > 320) 
                           & !is.na(fwd_date) ,TRUE, FALSE)]

    loginID userID       date   fwd_date repeat_oneyr
 1:       1      a 2017-01-03 2017-11-30         TRUE
 2:       6      a 2017-11-30 2017-12-30        FALSE
 3:       9      a 2017-12-30       <NA>        FALSE
 4:       2      b 2017-01-12 2017-12-09         TRUE
 5:       7      b 2017-12-09 2018-01-15        FALSE
 6:      10      b 2018-01-15       <NA>        FALSE
 7:       3      c 2017-01-14 2017-12-17         TRUE
 8:       8      c 2017-12-17       <NA>        FALSE
 9:       4      d 2017-01-19 2017-10-18        FALSE
10:       5      d 2017-10-18       <NA>        FALSE

DATA

df<-read.table(text="loginID     userID     date
1           a          2017-01-03
2           b          2017-01-12
3           c          2017-01-14
4           d          2017-01-19
5           d          2017-10-18
6           a          2017-11-30
7           b          2017-12-09
8           c          2017-12-17
9           a          2017-12-30
10          b          2018-01-15",header=T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...