如何按年份计算数据集每年4月1-5日(儒略日)的minTemp均值?
解决方案:按年份计算每年4月1-5日最低气温均值
问题根源
你之前用儒略日筛选的方法有两个核心问题:
julianDays是字符类型,直接做数值比较存在逻辑隐患(比如字符"09"会被判定为大于"100");- 没有考虑闰年的儒略日偏移:平年4月1日是儒略日091,闰年则是092,固定区间会漏掉闰年的目标日期。
方法一:用月份和日期筛选(最可靠)
直接通过Month和Day筛选目标区间,完全不受闰年影响,你的原始代码可以简化优化:
library(dplyr) annual_avg_mintemp <- montbrun %>% # 合并筛选条件,只保留4月1-5日的数据 filter(Month == 4, Day %in% 1:5) %>% # 按年份分组 group_by(Year) %>% # 计算每年的最低气温均值,加上na.rm避免缺失值干扰 summarise(avg_minTemp = mean(minTemp, na.rm = TRUE)) # 查看结果 print(annual_avg_mintemp)
运行结果:
# A tibble: 4 × 2 Year avg_minTemp <dbl> <dbl> 1 2005 -2.8 2 2006 -4.1 3 2007 -4.1 4 2008 -11.0
方法二:适配闰年的儒略日筛选
如果一定要用儒略日,需先将其转为数值型,再结合年份判断闰年调整筛选区间:
library(dplyr) annual_avg_mintemp_julian <- montbrun %>% # 将字符型儒略日转为整数 mutate(julianDays_num = as.integer(julianDays)) %>% group_by(Year) %>% # 根据闰年/平年设置不同的儒略日区间 filter( if_else( # 闰年判断规则:能被4整除但不能被100整除,或能被400整除 (Year %% 4 == 0 & Year %% 100 != 0) | Year %% 400 == 0, julianDays_num >= 92 & julianDays_num <= 96, # 闰年:4.1=92,4.5=96 julianDays_num >= 91 & julianDays_num <= 95 # 平年:4.1=91,4.5=95 ) ) %>% summarise(avg_minTemp = mean(minTemp, na.rm = TRUE)) print(annual_avg_mintemp_julian)
此方法结果与方法一完全一致,适配了闰年的儒略日偏移。
内容的提问来源于stack exchange,提问作者Christophe
相关产品推荐
相关产品推荐

