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

如何在R语言中基于巢孵化日期范围计算小时温度数据的平均值?

在R中按鸟巢孵化日期范围计算对应平均温度

问题描述

现有两个数据集:

  • df1:记录每个鸟巢的孵化起始与结束日期
  • df2:小时级温度数据

需要根据df1中每个鸟巢的日期范围,从df2中筛选对应时段的温度并计算平均值。

原始数据集

df1(鸟巢孵化日期)

structure(list(Nest.no = c("1", "4", "5", "10", "11"), Start = c("12-02-2009", "19-02-2009", "15-03-2009", "15-04-2009", "17-04-2009"), End = c("03-04-2009", "10-04-2009", "04-05-2009", "04-06-2009", "06-06-2009")), row.names = c(NA, 5L), class = "data.frame")

df2(小时温度数据)

structure(list(Nesting.season = c("2009 -2010", "2009 -2010", "2009 -2010", "2009 -2010", "2009 -2010"), Date = c("04-01-2010", "04-01-2010", "04-01-2010", "04-01-2010", "05-01-2010"), Temperature = c(23.773, 27.764, 24.448, 23.966, 23.869)), row.names = c(NA, 5L), class = "data.frame")

实现方案

方法1:dplyr + fuzzyjoin(简洁易读)

步骤1:加载依赖包

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

步骤2:转换日期格式

原始日期为字符型,需转为Date类型才能进行范围匹配:

# 处理df1的起止日期
df1 <- df1 %>%
  mutate(Start = dmy(Start),
         End = dmy(End))

# 处理df2的温度日期
df2 <- df2 %>%
  mutate(Date = dmy(Date))

步骤3:匹配范围并计算平均温度

用模糊连接匹配日期范围,再按鸟巢分组计算均值:

result <- df1 %>%
  fuzzy_left_join(df2,
                  by = c("Start" = "Date", "End" = "Date"),
                  match_fun = list(`<=`, `>=`)) %>% # 筛选df2.Date在[Start, End]区间内的记录
  group_by(Nest.no, Start, End) %>%
  summarise(Average_Temp = mean(Temperature, na.rm = TRUE)) %>%
  ungroup()

print(result)

方法2:data.table(高效处理大数据)

如果数据集规模较大,data.table的速度优势更明显:

library(data.table)
library(lubridate)

# 转为data.table格式
setDT(df1)
setDT(df2)

# 转换日期
df1[, c("Start", "End") := .(dmy(Start), dmy(End))]
df2[, Date := dmy(Date)]

# 匹配日期范围并计算均值
result_dt <- df2[df1, on = .(Date >= Start, Date <= End),
                 .(Average_Temp = mean(Temperature, na.rm = TRUE)),
                 by = .EACHI]

# 合并回原始鸟巢信息
result_dt <- df1[result_dt, on = .(Start = Date, End = Date)]
print(result_dt)

关键提示

  • 日期格式要对应:示例中日期为日-月-年,所以用dmy();如果是其他格式,需替换为mdy()或ymd()。
  • na.rm = TRUE用于忽略温度数据中的缺失值,避免结果为NA。
  • 示例中df2的日期均为2010年,与df1的2009年无重叠,因此计算结果会是NA,实际使用时需确保两个数据集的日期范围有交集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:10:20