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

