Как изменить переменные на временном интервале поворота по группам с неравными временными расстояниями? - PullRequest
1 голос
/ 24 апреля 2019

У меня большой df с 40.000.000 строками, охватывающий в общей сложности 2 года и более 400 тыс. Уникальных пользователей.Переменная времени отформатирована как POSIXct , и у меня есть уникальный идентификатор_пользователя на пользователя.Я наблюдаю за каждым пользователем в течение нескольких моментов времени.

Таким образом, каждая строка представляет собой уникальную комбинацию user_id, времени и набора переменных.

На основе набора фиктивных переменных (df $ v1, df $ v2), переменная категории (df $ category_var) и переменная времени (df $ time_var) Теперь я хочу вычислить 3 новые переменные на уровне user_id в скользящем временном окне за предыдущие 30 дней .Таким образом, в каждой строке новая переменная должна рассчитываться по значениям предыдущих 30 дней входных переменных.

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

До сих пор мне удавалось рассчитать только мои новые переменные для user_id за весь период наблюдения, но я не смогдостичь для расчета переменных за последние 30 дней скользящего окна для пользователя.

После проверки и опробования всех связанных постов, я предполагаю, что решение data.table является наиболее подходящим, но поскольку до сих пор я в основном работал с dplyr, попытка вычислить эти переменные в скользящем временном окне наУровень groupey_by user_id занял больше недели без каких-либо результатов.Я был бы очень благодарен за вашу поддержку!

Мой df в основном выглядит так:

user_id <- c(1,1,1,1,1,2,2,2,2,3,3,3,3,3)
time_var <- c(“,2,3,4,5, 1.5, 2, 3, 4.5, 1,2.5,3,4,5)
category_var <- c(“A”, “A”, “B”, “B”, “A”, “A”, “C”, “C”, “A”, …)
v1 <- c(0,1,0,0,1,0,1,1,1,0,1,…)
v2 <- c(1,1,0,1,0,1,1,0,...)

  1. Моя первая необходимая новая переменная (new_x1) - это, по сути, накопительная сумма, основанная на условиив фиктивной переменной v1.Чего я достиг на данный момент:

df <- df %>%  group_by(user_id) %>% mutate(new_x1=cumsum(v1==1)) 

Что мне нужно: чтобы переменные считали только предыдущие 30 дней на пользователя

Необходима новая переменная (new_x2): в основном кумулятивный счет v1, если v2 имеет (пока) уникальное значение.Таким образом, для каждого нового значения в v2, заданного v1 == 1, считайте.

Чего я достиг на данный момент:

df <- df %>% 
group_by(user_id, category_var) %>%
 mutate(new_x2 = cumsum(!duplicated(v2 )& v1==1))

Мне также нужно это на основе предыдущих 30 дней, а не всего периода наблюдения на пользователя.

Моя третья интересующая переменная (new__x3): время между двумя наблюдениями при определенном условии (v1 == 1)
#Interevent Time 
df2 <- df%>% group_by(user_id) %>% filter(v1==1) %>% mutate(time_between_events=time-lag(time))


Мне также понадобится это на предыдущих 30 днях.

Большое вам спасибо!

Редактировать после сообщения Джона Спрингса:

Тогда мое потенциальное решение будет

setDT(df)[, `:=`(new_x1= cumsum(df$v1==1[df$user_id == user_id][between(df$time[df$user_id == user_id], time-30, time, incbounds = TRUE)]), 
                         new_x2= cumsum(!duplicated(df$v1==1[df$user_id == user_id][between(df$time[df$user_id == user_id], time-30, time, incbounds = TRUE)]))),
                  by = eval(c("user_id", "time"))]

Я действительно не знаком с данными.table и не уверен, смогу ли я вложить свои условия на cumsum в data.table, вот так.

Есть предложения?

...