我有一个像这个虚拟样本这样的日期集。它包含两个月的数字用户活动数据。
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
)
第一个任务
我用key=c(user_id, app_id)
anddate
作为索引制作了一个 tsibble 对象。首先,我尝试获取整个期间每个用户每个 app_id 的平均使用量。用户可以在线任意天数、1 天、10 天、30 天或每天 == 60 天。我想根据活动日的用户数计算 rollapply 平均值。
示例:用户 18160102-aa 仅活动两天并使用 app_id 262 ,第一天使用 6 分钟,第二天使用 24 分钟,因此该用户在 app_id = 262 的整个期间的平均使用时间为 15 分钟。
我使用 tsibble::tile_dbl 计算整个期间的平均窗口大小 60(2 个月 = 60 天),然后将其转换回 tibble 并删除重复的行。像这样 :
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 天的平均和累计使用量,如何设置窗口大小?