如何统计指定日期区间内超阈值天数?R语言数据框处理方案
解决方法
问题分析
你原代码的核心问题是没有将每个测量周期的日期窗口与df2的日期做关联匹配,直接对整个df2的气温做判断,导致输出的是全局布尔值列表,而非每个周期的符合条件天数统计。
方法1:基于purrr+dplyr的逐行处理(适合中小数据量)
先确保所有日期字段为Date类型,再通过map2_int逐行计算每个周期内符合条件的天数:
library(dplyr) library(purrr) library(lubridate) # 转换日期格式(如果原始数据不是Date类型) df1 <- df1 %>% mutate(across(c(start_date, end_date), ymd)) df2 <- df2 %>% mutate(date = ymd(date)) # 生成目标结果表 result_df <- df1 %>% mutate(daysover25 = map2_int(start_date, end_date, ~ { # 筛选当前周期内气温≥25℃的记录并统计数量 df2 %>% filter(date >= .x, date <= .y, maxtemp >= 25) %>% nrow() }))
方法2:基于fuzzy_join的高效关联(适合大数据量)
如果数据量较大,逐行处理效率偏低,可通过模糊连接实现批量匹配统计:
library(fuzzyjoin) library(dplyr) library(lubridate) # 转换日期格式 df1 <- df1 %>% mutate(across(c(start_date, end_date), ymd)) df2 <- df2 %>% mutate(date = ymd(date)) # 模糊关联+分组统计 result_df <- df2 %>% filter(maxtemp >= 25) %>% # 匹配日期落在测量周期内的记录 fuzzy_inner_join(df1, by = c("date" = "start_date", "date" = "end_date"), match_fun = list(`>=`, `<=`)) %>% # 按测量周期分组统计天数 group_by(uniqueID, start_date, end_date) %>% summarise(daysover25 = n(), .groups = "drop") %>% # 补全无符合条件天数的周期(将NA替换为0) right_join(df1, by = c("uniqueID", "start_date", "end_date")) %>% mutate(daysover25 = replace_na(daysover25, 0))
两种方法最终都会返回包含uniqueID、start_date、end_date和daysover25列的目标数据表。
内容的提问来源于stack exchange,提问作者Taylor Harman
相关产品推荐
相关产品推荐

