0

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

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 天的平均和累计使用量,如何设置窗口大小?

4

1 回答 1

2

这是我对第一个问题的看法。我们不需要 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 包(v0.3.0)于 2019 年 10 月 11 日创建

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

于 2019-10-10T22:47:59.320 回答