R语言按站点年份分组 提取8月15日前最晚至10月15日后最早日期区间数据
R实现按站点年份分组筛选指定日期区间
首先需要将示例数据中字符串格式的date列转换为R内置的Date类型,否则直接做日期逻辑判断会出现错误。
方法一:dplyr 分组实现(代码简洁易读,推荐)
library(dplyr) # 转换日期格式 df$date <- as.Date(df$date) res <- df %>% group_by(site, year) %>% mutate( # 取分组内8月15日之前的最晚日期作为区间起点 start_date = max(date[date < as.Date(paste0(year, "-08-15"))]), # 取分组内10月15日之后的最早日期作为区间终点 end_date = min(date[date > as.Date(paste0(year, "-10-15"))]) ) %>% # 筛选区间内的记录 filter(date >= start_date, date <= end_date) %>% # 移除临时生成的辅助列 select(-start_date, -end_date) %>% ungroup()
方法二:基础R实现(无需安装第三方包)
# 转换日期格式 df$date <- as.Date(df$date) # 按site、year分组逐组处理 group_result <- by( data = df, INDICES = list(df$site, df$year), FUN = function(sub) { aug_cut <- as.Date(paste0(unique(sub$year), "-08-15")) oct_cut <- as.Date(paste0(unique(sub$year), "-10-15")) s <- max(sub$date[sub$date < aug_cut]) e <- min(sub$date[sub$date > oct_cut]) sub[sub$date >= s & sub$date <= e, ] } ) # 合并所有分组的结果 res_base <- do.call(rbind, group_result) rownames(res_base) <- NULL
注意事项
- 日期格式转换是必要步骤:如果直接用字符串比较日期,在跨年、跨月场景下很容易出现逻辑错误
- 上述代码默认每个分组都同时存在8月15日前、10月15日后的观测值,如果存在分组缺失对应时段数据,可在计算
start_date/end_date时补充na.rm = TRUE参数,或自定义异常处理逻辑 - 运行后每个分组会返回2条记录,正好对应区间的起止日期观测,和需求完全匹配
内容的提问来源于stack exchange,提问作者novice_coder
相关产品推荐
相关产品推荐

