Tsibble - 按组滚动 window 函数

Tsibble - Rolling window functions by group

我有一个类似这个虚拟样本的日期集。它包含数字用户 activity 两个月的数据。

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)date 作为索引创建了一个 tsibble 对象。首先,我尝试获取整个期间每个 app_id 每个用户的平均使用量。用户可以在线任意天数,1 天,10 天,30 天或每天 == 60 天。我想根据 activity 天的用户数计算 rollapply 平均值。

示例:用户 18160102-aa 只活跃了两天并使用了 app_id 262,第一天使用 6 分钟,第二天 24 分钟,所以此用户在 app_id 的整个期间的平均使用量= 262 是 15 分钟。

我用 tsibble::tile_dbl 计算了 window 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 天的平均和累计使用量,我该如何设置 window 大小?

这是我对第一个问题的看法。我们不需要 tsibble 对象来执行此任务。 tile_dbl() 创建一个临时分组变量 date60 并使用 group_by() + summarise() 计算平均值。

library(tidyverse)
df %>% 
  group_by(user_id, app_id) %>% 
  mutate(date60 = tsibble::tile_dbl(date, ~ .[1], .size = 60)) %>% 
  group_by(date60, add = TRUE) %>% 
  summarise(avg_period = mean(total_usage, na.rm = TRUE))
#> # A tibble: 6 x 4
#> # Groups:   user_id, app_id [6]
#>   user_id     app_id   date60 avg_period
#>   <chr>        <dbl>    <dbl>      <dbl>
#> 1 18120439-aa    383 20190701      185  
#> 2 18120439-ab    382 20190701       10  
#> 3 18120439-ab    383 20190701      412. 
#> 4 18160102-aa    262 20190807       15  
#> 5 18160102-aa    382 20190711       20.7
#> 6 18160102-aa    383 20190702       46.1

reprex package (v0.3.0)

于 2019-10-11 创建

关于第二个问题,我建议查看仅用于滚动 window 计算的 slide 包,包括 slide_index() 的特定日期的天数。 Tsibble 将逐渐弃用滚动 window 函数,转而使用 slide。您可能希望使用 slide.

寻找替代解决方案