我有一个类似这个虚拟样本的日期集。它包含两个月的数字用户活动数据。
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
作为索引创建了一个对象对象。首先,我尝试获得整个期间每个用户每个app_id的平均使用量。用户可以在线任何天数,1天,10天,30天或每天== 60天。我想根据活动日的用户数来计算rollapply平均值。
示例:用户18160102-aa仅活跃两天,并且使用了app_id 262,第一天使用6分钟,第二天24,因此该用户在app_id = 262的整个期间内的平均使用情况为15分钟。
我使用tsibble :: tile_dbl来计算窗口大小60的平均值(2个月= 60天) 整个期间,然后将其转换回小节并删除重复的行。像这样:
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天的平均和汇总使用情况,如何设置窗口大小?
答案 0 :(得分:1)
这是我对第一个问题的看法。我们不需要倾斜对象来执行此任务。 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 。您可能希望使用幻灯片查找替代解决方案。