如何在R中按区域将数据按两年间隔分组并新增标识列
R语言按区域动态划分两年间隔分类实现方案
实现思路
- 步骤1:按区域分组,计算每个区域的最早年份
min_year - 步骤2:基于各区域最早年份,计算每行数据所属的两年间隔起始点:以
(年份 - 区域最早年份) %/% 2 * 2 + 区域最早年份得到间隔起始年,间隔结束年为起始年+1 - 步骤3:按「区域+间隔起始年」分组,统计每组内的年份数量,判断是单年还是双年数据,生成对应标签
完整实现代码
# 加载依赖包 library(dplyr) df_result <- df %>% # 年份转数值型方便计算 mutate(year = as.integer(year)) %>% # 步骤1:计算每个区域的最早年份 group_by(region) %>% mutate(min_year = min(year)) %>% # 步骤2:计算每行所属的两年间隔起止年 mutate( gap_start = min_year + (year - min_year) %/% 2 * 2, gap_end = gap_start + 1 ) %>% # 步骤3-4:按分组判断年份数量生成对应标签 group_by(region, gap_start) %>% mutate( year_group = if_else( n_distinct(year) == 2, paste0(gap_start, "-", gap_end), as.character(year) ) ) %>% # 可选:移除中间计算列,保留原始字段+新生成的分类列 ungroup() %>% select(-min_year, -gap_start, -gap_end)
关键逻辑说明
步骤2的核心是用整数除法
%/%实现两年间隔的自动分组:和区域最早年份的差值除以2取整,再乘2回推,就能保证同一间隔内的年份对应同一个起始值,完美适配每个区域不同的起始年份要求。
举例:若某区域最早年份为2010,2010、2011与起始年的差值为0、1,除以2取整结果均为0,对应间隔2010-2012;2012、2013差值为2、3,除以2取整结果均为1,对应间隔2012-2013,以此类推。若间隔内仅存在单个年份(如样本中的2019年),则直接保留原年份值作为分类标签。
内容的提问来源于stack exchange,提问作者vita_aquaticus
相关产品推荐
相关产品推荐

