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

R语言双数据框日期匹配 批量计算指定区间气候统计值

R语言批量匹配位点+前置时间窗口气候统计值计算方案

基础信息

  • 涉及两个核心数据框:
    • climate:存储4年周期内所有监测位点、对应日期的气象观测数据
    • trap:存储各位点开展动物诱捕的当日日期记录
  • 核心需求:针对每条诱捕记录,按照位点匹配原则,回溯指定长度的前置时间窗口,筛选对应区间的气象数据计算统计值;不同气象变量对应的时间窗口长度存在差异,方案需适配大规模数据集的高效计算。

示例数据

构造代码

climate <- data.frame(site=c(1,1,1,1,2,2,2,2,1,1,1,1), 
                      precip=c(0.1,0.2,0.1,0.1,0.5,0.2,0.3,0.1,0.2,0.1,0.1,0.5), 
                      humid=c(1,1,3,1,2,3,3,1,1,3,1,2),
                      date=c("6/13/2020","6/12/2020","6/11/2020","6/14/2020","6/13/2020","6/12/2020","6/11/2020","6/14/2020","2/13/2019","2/14/2019","2/15/2019","2/16/2019")) 

trap <- data.frame(site=c(1,2,3,3), date=c("7/1/2020","7/1/2020","7/2/2020","7/4/2020"))

数据预览

> climate
   site precip humid      date
1     1    0.1     1 6/13/2020
2     1    0.2     1 6/12/2020
3     1    0.1     3 6/11/2020
4     1    0.1     1 6/14/2020
5     2    0.5     2 6/13/2020
6     2    0.2     3 6/12/2020
7     2    0.3     3 6/11/2020
8     2    0.1     1 6/14/2020
9     1    0.2     1 2/13/2019
10    1    0.1     3 2/14/2019
11    1    0.1     1 2/15/2019
12    1    0.5     2 2/16/2019

> trap
  site     date
1    1 7/1/2020
2    2 7/1/2020
3    3 7/2/2020
4    3 7/4/2020

计算规则

  • 湿度均值:对每条诱捕记录,计算诱捕日期前18-20天、对应位点的humid列平均值

    示例:诱捕日期为2020年7月1日时,统计区间为2020年6月11日-6月13日,位点1计算结果为1.667,位点2计算结果为2.67

  • 降水总和:对每条诱捕记录,计算诱捕日期前497-500天、对应位点的precip列累计值

    示例:诱捕日期为2020年7月1日时,统计区间为2019年2月13日-2月16日,位点1计算结果为0.9

高效实现方案

优先推荐data.table非等值连接方案,无逐行循环逻辑,十万至百万级数据量下计算速度远高于常规dplyr/基础R循环方案。

方案1:data.table实现(推荐,大数据集首选)

# 加载依赖
library(data.table)

# 转换数据格式,统一日期列为标准Date类型
setDT(climate)
setDT(trap)
climate[, date := as.Date(date, format = "%m/%d/%Y")]
trap[, date := as.Date(date, format = "%m/%d/%Y")]

# 1. 计算前18-20天湿度均值
# 生成时间窗口上下限
trap[, `:=`(humid_win_start = date - 20, humid_win_end = date - 18)]
# 非等值连接匹配同站点、日期落在窗口内的气象记录,分组求均值
trap[climate,
     humid_mean := mean(i.humid, na.rm = TRUE),
     on = .(site, humid_win_start <= date, humid_win_end >= date),
     by = .EACHI]

# 2. 计算前497-500天降水总和
# 生成时间窗口上下限
trap[, `:=`(precip_win_start = date - 500, precip_win_end = date - 497)]
# 非等值连接匹配后分组求和
trap[climate,
     precip_sum := sum(i.precip, na.rm = TRUE),
     on = .(site, precip_win_start <= date, precip_win_end >= date),
     by = .EACHI]

# 查看最终结果
trap[, .(site, date, humid_mean, precip_sum)]

运行后返回结果与示例预期完全一致,无对应气象数据的位点(如示例中的site=3)会自动返回NA,方便后续缺失值排查。
如果需要新增其他窗口的统计值,只需参照上述模板,修改窗口天数、统计函数(支持max/min/sd等任意聚合函数)、对应气象变量名即可。

方案2:dplyr+fuzzyjoin实现(小数据集可选,语法更易读)

library(dplyr)
library(fuzzyjoin)
library(lubridate)

# 日期格式转换
climate <- climate %>% mutate(date = mdy(date))
trap <- trap %>% mutate(date = mdy(date))

# 计算湿度均值
trap_with_humid <- trap %>%
  mutate(humid_win_start = date - days(20), humid_win_end = date - days(18)) %>%
  fuzzy_left_join(
    climate,
    by = c("site" = "site", "humid_win_start" = "date", "humid_win_end" = "date"),
    match_fun = list(`==`, `<=`, `>=`)
  ) %>%
  group_by(site.x, date.x) %>%
  summarise(humid_mean = mean(humid, na.rm = TRUE), .groups = "drop") %>%
  rename(site = site.x, date = date.x)

# 降水总和计算逻辑与上述一致,替换窗口参数、统计函数、对应变量即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:36:26