使用dplyr处理分组数据:获取年份最小时的assignment值生成新变量
解决方案
你可以使用dplyr包的分组操作实现需求,核心逻辑是按id分组后,提取每个组内最小年份对应的assignment值,再将该值赋给组内所有行的新变量。
代码实现
先加载dplyr包(未安装的话先执行install.packages("dplyr")),再处理数据集:
library(dplyr) # 原数据集 id <- c(1,1,1,2,2,2) year <- c(2012, 2013, 2014, 2012, 2013, 2014) assignment <- c(0,1,1,0,0,0) df <- cbind.data.frame(id, year, assignment) # 生成新变量 df <- df %>% group_by(id) %>% # 提取当前组最小年份对应的assignment值,[1]避免同组多最小年份行返回多值 mutate(initial_assignment = assignment[year == min(year)][1]) %>% ungroup()
操作说明
group_by(id):按id拆分数据集,后续操作仅在每个id的子集中执行。assignment[year == min(year)]:定位当前组内年份最小的行,提取对应的assignment值;添加[1]是为了处理同组存在多个最小年份行的边界情况,确保只取一个值。ungroup():取消分组结构,恢复数据集的常规格式(可根据后续需求选择是否保留分组)。
执行后新增的initial_assignment列会符合预期:
id=1的所有行值为0(对应2012年的assignment)id=2的所有行值为0(对应2012年的assignment)
替代写法(更直观)
用slice_min直接筛选每组最小年份的行,再提取assignment值:
df <- df %>% group_by(id) %>% mutate(initial_assignment = slice_min(., year, n=1, with_ties=FALSE) %>% pull(assignment)) %>% ungroup()
slice_min(., year, n=1, with_ties=FALSE):在每组内仅取年份最小的1行(with_ties=FALSE确保多最小年份行时只取第一行)。pull(assignment):提取该行的assignment值,作为组内所有行的新变量值。
内容的提问来源于stack exchange,提问作者Muhammad Kamil
相关产品推荐
相关产品推荐

