Nano Hash - криптовалюты, майнинг, программирование

Выберите предшествующие наблюдения X для работы с сгруппированными данными

Я наблюдаю за количеством покупок разных клиентов в несколько дней (1 = покупка, 0 = нет покупки). Теперь для каждого дня я хочу суммировать количество покупок конкретного клиента за предыдущие 2 дня и текущий день, то есть всего за 3 дня.

Пример данных:

da <- data.frame(customer_id = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
                 day = c("2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15"),
                 purchase = c(1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,1,0,1,0,1))

> da
   customer_id        day purchase
1            1 2016-04-11        1
2            1 2016-04-12        1
3            1 2016-04-13        1
4            1 2016-04-14        0
5            1 2016-04-15        1
6            2 2016-04-11        0
7            2 2016-04-12        0
8            2 2016-04-13        1
9            2 2016-04-14        1
10           2 2016-04-15        0
11           3 2016-04-11        1
12           3 2016-04-12        1
13           3 2016-04-13        1
14           3 2016-04-14        1
15           3 2016-04-15        0
16           4 2016-04-11        1
17           4 2016-04-12        0
18           4 2016-04-13        1
19           4 2016-04-14        0
20           4 2016-04-15        1

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

output_da <- data.frame(customer_id = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
                 day = c("2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15"),
                 purchase = c(1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,1,0,1,0,1),
                 purchases_last_3_days = c(1,2,3,2,2,0,0,1,2,2,1,2,3,3,2,1,1,2,1,2))

output_da
   customer_id        day purchase purchases_last_3_days
1            1 2016-04-11        1                     1
2            1 2016-04-12        1                     2
3            1 2016-04-13        1                     3
4            1 2016-04-14        0                     2
5            1 2016-04-15        1                     2
6            2 2016-04-11        0                     0
7            2 2016-04-12        0                     0
8            2 2016-04-13        1                     1
9            2 2016-04-14        1                     2
10           2 2016-04-15        0                     2
11           3 2016-04-11        1                     1
12           3 2016-04-12        1                     2
13           3 2016-04-13        1                     3
14           3 2016-04-14        1                     3
15           3 2016-04-15        0                     2
16           4 2016-04-11        1                     1
17           4 2016-04-12        0                     1
18           4 2016-04-13        1                     2
19           4 2016-04-14        0                     1
20           4 2016-04-15        1                     2

Я знаю о функции cumsum, но не знаю, как выбрать количество X строк, предшествующих каждому текущему дню.


Ответы:


1

Если вам нужны только последние 3 строки, вы можете сделать это вручную:

library(dplyr)
output_da <- da %>% 
    group_by(customer_id) %>% 
    mutate(pday = lag(purchase, default = 0), 
           apday = lag(purchase, n = 2, default = 0), 
           purchases_last_3_days = rowSums(across(c(purchase, pday, apday))),
           pday = NULL, apday = NULL)

ОБНОВЛЕНИЕ

А если вам нужно больше, чем последние 3 строки, можно немного автоматизировать, изменив 3 на подходящее число:

library(dplyr)
library(purrr)
last_day_rows <- 3
da %>% 
    group_by(customer_id) %>% 
    mutate(purchases_last_3_days = 
           rowSums(map_dfc(c(1:last_day_rows), 
           ~lag(purchase, n = .x - 1, default = 0))))
27.07.2020
  • @Scijens Я обновил ответ на случай, если вам понадобится больше, чем за последние 3 дня 27.07.2020
  • Так даже лучше (... а мне это понадобится), спасибо! 27.07.2020

  • 2

    Вот базовый вариант R через ave

    output_da <- within(
      da,
      purchases_last_3_days <- ave(purchase,
        customer_id,
        FUN = function(v) sapply(seq_along(v), function(k) sum(v[pmax(k - 2, 1):k]))
      )
    )
    
    27.07.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..