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
相关产品推荐
相关产品推荐

