You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()

代码逻辑说明

  1. 按id分组,计算每个ID的最晚日期max(date),以此界定「最后一个月」的时间范围(max(date)-30之后)。
  2. 提取最后一个月的产品编码集合,与历史(最后一个月之前)的编码集合做对比。
  3. 判断是否存在不在历史集合中的新编码,存在则标记为1,否则为0,用as.integer()将布尔值转为数字。
  4. 输出每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:39:52