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.
寻找替代解决方案
我有一个类似这个虚拟样本的日期集。它包含数字用户 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.