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

R语言按年份分组筛选每年8月15日-10月15日的数据子集

R 分年份按固定月日区间筛选数据行实现

前置准备

首先确保date列已转换为R的Date类型,否则日期大小比较会出现逻辑错误。先构造示例测试数据集:

df <- data.frame(
  site = rep(c("A", "B"), each = 4, times = 2),
  year = rep(c(2019, 2020), each = 8),
  date = as.Date(c(
    "2019-08-08", "2019-08-18", "2019-10-14", "2019-10-27",
    "2019-08-07", "2019-08-19", "2019-10-15", "2019-10-20",
    "2020-08-08", "2020-08-18", "2020-10-14", "2020-10-27",
    "2020-08-07", "2020-08-19", "2020-10-15", "2020-10-20"
  ))
)

筛选逻辑不需要按年写循环,只要判断每一行的日期是否落在对应年份的8月15日 ~ 10月15日区间内即可,以下是三种常用实现方案:


方案1:dplyr + lubridate(日常分析首选,可读性高)

适合常规数据处理场景,代码逻辑直观易维护:

library(dplyr)
library(lubridate)

res <- df %>%
  filter(
    date >= make_date(year, 8, 15),
    date <= make_date(year, 10, 15)
  )
  • 核心逻辑:用make_date()针对每一行的year值,动态生成当年8月15日、10月15日两个边界日期,直接做大小比较即可自动按年完成筛选,不需要额外分组操作。

方案2:base R 原生实现(无第三方包依赖)

不需要安装任何扩展包,直接用R基础函数完成:

# 逐行生成对应年份的区间上下限
start_date <- as.Date(paste0(df$year, "-08-15"))
end_date <- as.Date(paste0(df$year, "-10-15"))
# 按条件取子集
res <- df[df$date >= start_date & df$date <= end_date, ]

方案3:data.table 实现(高性能,适配大数据量)

适合百万行级以上的数据集,运行速度远高于前两种方案:

library(data.table)
setDT(df)
res <- df[date >= as.IDate(paste0(year, "-08-15")) & date <= as.IDate(paste0(year, "-10-15"))]

筛选结果验证

三种方案返回结果完全一致,共8行符合条件的数据:

site year       date
1    A 2019 2019-08-18
2    A 2019 2019-10-14
3    B 2019 2019-08-19
4    B 2019 2019-10-15
5    A 2020 2020-08-18
6    A 2020 2020-10-14
7    B 2020 2020-08-19
8    B 2020 2020-10-15

注意:如果date列是字符串格式,一定要先用as.Date()转成日期类型再做比较,否则会按字符串字典序比较,出现类似"2019-08-9"比"2019-08-15"大的逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:01:14