Учитывая кадр данных, определяется по формуле:Правильное использование функций dplyr для расчета продаж каждого продукта в скользящем окне без необходимости прохода или присоединения?
set.seed(1)
date <- sample(seq(as.Date('2016/01/01'), as.Date('2016/12/31'), by="day"), 12)
vals <- data.frame(x = rep(1:3, 4), date = date, cost = rnorm(12, 100))
vals
# x date cost
# 1 1 2016-04-07 100.48743
# 2 2 2016-05-15 100.73832
# 3 3 2016-07-27 100.57578
# 4 1 2016-11-25 99.69461
# 5 2 2016-03-14 101.51178
# 6 3 2016-11-20 100.38984
# 7 1 2016-12-06 99.37876
# 8 2 2016-08-25 97.78530
# 9 3 2016-08-13 101.12493
# 10 1 2016-01-23 99.95507
# 11 2 2016-12-27 99.98381
# 12 3 2016-03-03 100.94384
Я хочу, чтобы добавить новый столбец, где новое значение I го строки является суммой всех значений стоимости, для которых:
- дата меньше или равна дате я й и больше, чем я м дата минус 90 дней
- и значение х равно х значение строки я. (В данном примере комбинации х и даты являются уникальными, но в целом они не могут быть.)
Я могу сделать это двумя различными способами:
tmp <- vals %>% group_by(date, x) %>%
summarise(total = sum(vals$cost[vals$date <= date[1] & vals$date > (date[1] - 90) & vals$x == x[1]]))
vals %>% left_join(tmp)
и
vals %>% rowwise() %>%
mutate(total = sum(vals$cost[vals$date <= date[1] & vals$date > (date[1] - 90) & vals$x == x]))
Оба довольно медленные мои большие данные, по-видимому, из-за всех подмножеств. И я передаю кадр данных обратно в расчет, который для меня немного взломан.
Есть ли способ сделать это «правильно» в пределах dplyr
? Под этим я подразумеваю, без необходимости проходить в кадре данных и делать медленное подмножество.
Или, если нет, есть ли, по крайней мере, более эффективный способ сделать это?
Спасибо! Кажется, единственный способ - сначала заказать по дате. Я надеялся, что не должен этого делать, но тогда это будет намного сложнее, я думаю. – Danny