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

使用dplyr按id分组构建core变量:标记首次观测产品及后续记录

用dplyr实现按ID分组标记首次观测产品集合的core变量

原始数据

定义原始数据框df:

df <- data.frame(year = c("2000", "2000", "2000", "2002", "2007", "2001", "2002", "2003", "2007"), 
                 id = c("X", "X", "X", "X", "X", "Z", "Z", "Z", "Z"), 
                 product = c("apple","orange", "melon", "orange", "orange", "orange", "orange", "orange", "truffels"), 
                 market = c("CHN", "USA", "USA", "CAN", "USA", "USA", "USA", "USA", "ECU"), 
                 value = c(1, 2, 3, 4, 5, 6, 7, 8, 9))

需求说明

按id分组构建core变量:

  • 若当前行的product属于该id首次观测年份中出现的所有产品集合,则core取值为1
  • 否则取值为0

期望输出的df_new如下:

df_new <- data.frame(year = c("2000", "2000", "2000", "2002", "2007", "2001", "2002", "2003", "2007"), 
                 id = c("X", "X", "X", "X", "X", "Z", "Z", "Z", "Z"), 
                 product = c("apple","orange", "melon", "orange", "orange", "orange", "orange", "orange", "truffels"), 
                 market = c("CHN", "USA", "USA", "CAN", "USA", "USA", "USA", "USA", "ECU"), 
                 value = c(1, 2, 3, 4, 5, 6, 7, 8, 9),
                 core= c(1, 1, 1, 1, 1, 1, 1, 1, 0)
)

之前尝试的问题

此前使用的代码:

df_new <- df %>% group_by(product, id) %>% mutate(core = +(year == min(year)))

仅能标记每个id-product组合的首次出现年份,无法满足“判断产品是否属于该id首次观测的产品集合”的核心需求。

正确的dplyr实现方案

实现逻辑

  1. 按id分组,计算每个分组的最早观测年份
  2. 基于最早年份,提取该分组下的所有产品,形成核心产品集合
  3. 对每一行的product判断是否属于核心集合,将布尔值转为1/0的core变量

代码实现

library(dplyr)

df_new <- df %>%
  group_by(id) %>%
  # 计算当前id的最早观测年份
  mutate(min_year = min(year)) %>%
  # 提取最早年份对应的所有产品,存入列表列
  mutate(core_products = list(product[year == min_year])) %>%
  # 判断当前产品是否在核心集合中,转为1/0数值
  mutate(core = +(product %in% core_products)) %>%
  # 移除中间辅助变量
  select(-min_year, -core_products) %>%
  ungroup()

运行后输出结果与期望的df_new完全一致。

内容的提问来源于stack exchange,提问作者vog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:45:30