【发布时间】:2023-03-31 08:18:01
【问题描述】:
这里有一些虚拟数据:
user_id date category
27 2016-01-01 apple
27 2016-01-03 apple
27 2016-01-05 pear
27 2016-01-07 plum
27 2016-01-10 apple
27 2016-01-14 pear
27 2016-01-16 plum
11 2016-01-01 apple
11 2016-01-03 pear
11 2016-01-05 pear
11 2016-01-07 pear
11 2016-01-10 apple
11 2016-01-14 apple
11 2016-01-16 apple
我想计算每个user_id在指定时间段(例如过去7、14天)内不同categories的数量,包括当前订单
解决方案如下所示:
user_id date category distinct_7 distinct_14
27 2016-01-01 apple 1 1
27 2016-01-03 apple 1 1
27 2016-01-05 pear 2 2
27 2016-01-07 plum 3 3
27 2016-01-10 apple 3 3
27 2016-01-14 pear 3 3
27 2016-01-16 plum 3 3
11 2016-01-01 apple 1 1
11 2016-01-03 pear 2 2
11 2016-01-05 pear 2 2
11 2016-01-07 pear 2 2
11 2016-01-10 apple 2 2
11 2016-01-14 apple 2 2
11 2016-01-16 apple 1 2
【问题讨论】:
-
为什么以
0开头? -
这是我的错字,现已更正,谢谢!
-
您确定
distinct_7中的值正确吗?如果我查看 2016-01-10,它是否应该作为一个新组开始。此外,如果您查看distinct_7的值,user_id11,它从 0 开始。 -
在
distinct_7中,在2016-01-10和2016-01-03之间,user 27共有 3 个类别,user 11共有 2 个类别。现在有意义吗? -
您可以遍历
date,即library(tidyverse); df %>% group_by(user_id) %>% mutate(distinct_7 = map_int(date, ~n_distinct(category[date >= .x - 7 & date <= .x])), distinct_14 = map_int(date, ~n_distinct(category[date >= .x - 14 & date <= .x]))),尽管我认为使用zoo::rollapply等可能有更优雅的方法。
标签: r data.table dplyr distinct-values