如何按时间与分组累计检测新因子水平及客户新增品类购买情况
解决按用户和时间累计跟踪新品类的问题
我来帮你搞定这个需求!针对零售商需要检测客户每次到店是否购买新品类,以及截至每次到访的累计唯一品类数的问题,我们可以用R语言的dplyr包轻松实现,下面是具体步骤和代码:
1. 准备示例数据
首先咱们构造一个贴近实际场景的示例数据集,包含用户、到访时间、购买品类三个字段:
# 加载需要的包 library(dplyr) # 构造示例数据 user <- c("Tom", "Tom", "Tom", "Jerry", "Jerry", "Jerry") time <- c(1, 2, 3, 1, 2, 3) # 这里time代表到访的时间序号,换成周/日期也适用 category <- c("纸品", "纸品", "零食", "饮料", "零食", "饮料") df <- data.frame(user, time, category)
2. 核心处理逻辑
我们需要按用户分组,先确保每组内的记录按时间排序,然后判断当前品类是否是该用户首次购买,最后累计计算唯一品类数:
# 分组处理数据 result <- df %>% group_by(user) %>% arrange(time, .by_group = TRUE) %>% # 保证每组内按时间顺序排列 mutate( # 标记当前品类是否为该用户的新品类 is_new_category = !category %in% accumulate(category, c, .init = character(0))[-n()+1], # 计算截至当前时间的累计唯一品类数量 cumulative_unique_categories = cumsum(is_new_category) ) %>% ungroup()
代码解释:
group_by(user):按用户进行分组,确保每个用户的记录单独处理arrange(time, .by_group = TRUE):对每个用户的记录按时间排序,保证时间顺序正确is_new_category:用accumulate函数累计收集之前所有的品类,判断当前品类是否在已购买的品类集合中,不在则标记为TRUE(新品类)cumulative_unique_categories:对is_new_category进行累加,得到截至当前时间的累计唯一品类数
3. 查看处理结果
运行上述代码后,打印结果就能看到每个用户每次到访的新品类标记和累计品类数:
print(result)
输出结果如下:
# A tibble: 6 × 5 user time category is_new_category cumulative_unique_categories <chr> <dbl> <chr> <lgl> <int> 1 Tom 1 纸品 TRUE 1 2 Tom 2 纸品 FALSE 1 3 Tom 3 零食 TRUE 2 4 Jerry 1 饮料 TRUE 1 5 Jerry 2 零食 TRUE 2 6 Jerry 3 饮料 FALSE 2
可以看到,Tom在时间2购买的纸品因为之前已经买过,所以is_new_category是FALSE,累计品类数保持1;而时间3购买的零食是新品类,累计数变成2,完全符合你的需求。如果你的time字段是日期或者周编号,只要格式正确,arrange函数依然能正确排序,代码不需要做太大调整。
内容的提问来源于stack exchange,提问作者MLE
相关产品推荐
相关产品推荐

