如何基于月份与年份列创建关联前一年的鱼类捕捞季节分箱列
解决跨年度季节分组的问题
这确实是处理时间序列分组时的典型需求——咱们需要把1-2月的「cold」季节关联到前一年,而不是当前年份。我来帮你调整代码,完美实现这个逻辑:
修改后的完整代码
# 生成示例数据(和你原来的一致) fish <- data.frame(month = sample(1:12,36,replace=T), year = sample(c(2015,2016,2017),36,replace=T)) fish <- fish[order(fish$year,fish$month),] library(dplyr) # 1. 先按月份生成分季节标签 lev <- c(-Inf, 2, 6, 10, Inf) lab <- c("cold", "warmer", "warm", "cold") fish <- fish %>% mutate(season = cut(month, lev, labels = lab)) %>% # 2. 核心:调整年份——1-2月的cold组年份减1 mutate(season_year = case_when( season == "cold" & month %in% 1:2 ~ year - 1, TRUE ~ year )) %>% # 可选:合并年份和季节为一个分组列,方便后续统计 mutate(season_group = paste(season_year, season, sep = "_"))
代码解释
- 季节标签生成:你原来的
cut逻辑完全正确,把月份分成了「cold(11-2月)、warmer(3-6月)、warm(7-10月)」三组。 - 年份调整:用
case_when做条件判断:- 如果是
cold季节且月份在1-2月,就把年份减1(比如2016年1月→2015年cold组) - 其他所有情况(包括11-12月的cold组)都保留原年份
- 如果是
- 分组列优化:最后生成的
season_group列(比如2015_cold、2016_warmer)可以直接用来做后续的分组统计,非常方便。
验证结果
你可以运行下面的代码查看1-2月的分组是否正确:
fish %>% filter(month %in% 1:2) %>% select(year, month, season, season_year, season_group)
比如你会看到类似这样的结果:
year month season season_year season_group 1 2016 1 cold 2015 2015_cold 2 2017 2 cold 2016 2016_cold
这样就完全实现了你要的「1-2月cold组关联前一年」的需求啦!
内容的提问来源于stack exchange,提问作者M.Teich
相关产品推荐
相关产品推荐

