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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:36:21