使用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实现方案
实现逻辑
- 按
id分组,计算每个分组的最早观测年份 - 基于最早年份,提取该分组下的所有产品,形成核心产品集合
- 对每一行的
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
相关产品推荐
相关产品推荐

