У меня есть набор дат, похожий на этот фиктивный образец. Он содержит данные за два месяца для цифровой активности пользователей.
df <- tibble::tribble(
~date, ~user_id, ~app_id, ~total_usage,
20190701, "18120439-aa", 383, 223,
20190702, "18120439-aa", 383, 147,
20190701, "18120439-ab", 382, 10,
20190701, "18120439-ab", 383, 395,
20190702, "18120439-ab", 383, 495,
20190703, "18120439-ab", 383, 347,
20190807, "18160102-aa", 262, 6,
20190808, "18160102-aa", 262, 24,
20190711, "18160102-aa", 382, 3,
20190725, "18160102-aa", 382, 11,
20190727, "18160102-aa", 382, 48,
20190702, "18160102-aa", 383, 6,
20190705, "18160102-aa", 383, 42,
20190706, "18160102-aa", 383, 104,
20190708, "18160102-aa", 383, 12,
20190709, "18160102-aa", 383, 13,
20190710, "18160102-aa", 383, 114,
20190712, "18160102-aa", 383, 187,
20190713, "18160102-aa", 383, 37,
20190715, "18160102-aa", 383, 58,
20190716, "18160102-aa", 383, 40,
20190717, "18160102-aa", 383, 40,
20190718, "18160102-aa", 383, 35,
20190719, "18160102-aa", 383, 19,
20190720, "18160102-aa", 383, 63,
20190723, "18160102-aa", 383, 2,
20190726, "18160102-aa", 383, 69,
20190729, "18160102-aa", 383, 31,
20190730, "18160102-aa", 383, 26,
20190731, "18160102-aa", 383, 41,
20190802, "18160102-aa", 383, 50,
20190805, "18160102-aa", 383, 34,
20190806, "18160102-aa", 383, 23,
20190807, "18160102-aa", 383, 14
)
Первая задача
Я создал объект tsibble с key=c(user_id, app_id)
и date
в качестве индекса. Сначала я попытался получить среднее использование на пользователя на app_id за весь период. Пользователь может быть в сети любое количество дней, 1 день, 10 дней, 30 или каждый день == 60 дней. Я хотел рассчитать среднее значение на основе числа пользователей в день активности.
пример: пользователи 18160102-aa были активны только два дня и использовали app_id 262, первый день использования 6 минут, второй день 24, так что среднее использование для этогоПользователь в течение всего периода для app_id = 262 составляет 15 минут.
Я использовал tsibble :: tile_dbl для вычисления среднего размера окна 60 (2 месяца = 60 дней) за весь период, а затем преобразовал его обратно в таблицуи удалите дубликат строки. например:
library(tidyverse)
library(tsibble)
df %>%
#create a tsibble object
as_tsibble(key = c(user_id, app_id), index = date) %>%
group_by_key() %>%
# calculate average during the activity period
mutate(Avg_period = tile_dbl(total_usage, ~ mean(., na.rm = TRUE), .size = 60)) %>%
as_tibble() %>%
select(-total_usage, -date) %>%
distinct()
Вывод кажется правильным, однако мне интересно, есть ли лучший способ сделать это без создания дубликата?
Второе задание
Как можноЯ устанавливаю размер окна, если я хочу рассчитать среднее и свернутое использование за последние 7 дней, 14 и 21 день из определенных дней?