使用dplyr按id分组并基于时间条件判断重复product_code的问题
问题解决:按ID判断最后一个月是否有新的产品编码
原代码问题分析
原代码存在两处关键错误:
- 错误使用
any():any(product_code[date>max(date)-30])会将产品编码向量转为布尔值(仅判断是否存在非空元素),再用该布尔值与历史编码向量做%in%匹配,完全偏离需求逻辑。 - 逻辑方向与期望结果相反:原代码判断的是「最后一个月的编码是否在历史记录中出现过」,但实际需要判断的是「最后一个月是否存在从未在历史中出现过的新编码」。
正确代码实现
用dplyr的summarize直接按组聚合计算,代码更简洁高效:
library(dplyr) df %>% group_by(id) %>% summarize( new_product_code = as.integer( # 核心逻辑:判断最后一个月的编码中是否存在不在历史记录里的新编码 any(!product_code[date > max(date) - 30] %in% product_code[date <= max(date) - 30]) ) ) %>% ungroup()
代码逻辑说明
- 按
id分组,计算每个ID的最晚日期max(date),以此界定「最后一个月」的时间范围(max(date)-30之后)。 - 提取最后一个月的产品编码集合,与历史(最后一个月之前)的编码集合做对比。
- 判断是否存在不在历史集合中的新编码,存在则标记为1,否则为0,用
as.integer()将布尔值转为数字。 - 输出每个ID的唯一结果。
运行结果
执行代码后输出与期望完全一致:
# A tibble: 4 × 2 id new_product_code <dbl> <int> 1 1 1 2 2 0 3 3 0 4 4 1
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

