Вот решение для неравного соединения data.table
. Это зависит от обновления по ссылке.
library (data.table)
dt[, SOLVED_DATE := as.Date(SOLVED_DATE)]
dt[, `:=` (END_RANGE = SOLVED_DATE - 7, PAST_7DAY_SOLVED_HISTORY = 0L)]
dt[dt
, on = .(USER_ID
, SOLVED_DATE > SOLVED_DATE
, END_RANGE < SOLVED_DATE)
, PAST_7DAY_SOLVED_HISTORY :=.N
, by = .EACHI
][, END_RANGE := NULL]
Вот решение dplyr
в том же духе, которое использует некоторые идеи @Ronak Shah для суммирования.
tib%>%
mutate(SOLVED_DATE = as.Date(SOLVED_DATE))%>%
inner_join(.,., by = 'USER_ID')%>%
group_by(USER_ID, SOLVED_DATE = SOLVED_DATE.x)%>%
summarize(
QUESTIONS_SOLVED = first(QUESTIONS_SOLVED.x) #a little hacky
, PAST_7DAY_SOLVED_HISTORY =sum(QUESTIONS_SOLVED.x[SOLVED_DATE.x > SOLVED_DATE.y & SOLVED_DATE.x - 7 < SOLVED_DATE.y]))
Для этого набора данных @Ronak - самый быстрый.
Unit: milliseconds
expr min lq mean median uq max neval
purrr_ronak 2.0315 2.13435 2.306462 2.1988 2.32110 5.2616 100
dplyr_cole_join 2.2900 2.38270 2.716720 2.4537 2.54155 17.7151 100
dt_cole 4.4387 4.77680 5.102791 5.0109 5.16260 9.7652 100
dplyr_zoo_hump 8.9480 9.31415 10.067683 9.4534 9.92390 40.9371 100