【问题标题】:Tsibble - Rolling window functions by groupTsibble - 按组滚动窗口函数
【发布时间】:2020-02-07 03:52:25
【问题描述】:

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

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 天。我想根据用户活动天数计算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 天的平均使用量和累计使用量,如何设置窗口大小?

【问题讨论】:

    标签: r time-series tidyverse rolling-computation tsibble


    【解决方案1】:

    这是我对第一个问题的看法。我们不需要 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 日创建

    关于第二个问题,我建议查看 slide 包仅用于滚动窗口计算,包括使用 slide_index() 的特定日期的天数。 Tsibble 将逐渐弃用滚动窗口功能,转而支持 slide。您可能想使用 slide 寻找替代解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2018-05-08
      • 2011-10-12
      • 2021-01-28
      • 2010-10-24
      相关资源
      最近更新 更多