基于参考数据框对多站点年日降雨数据框求和
解决方法:按站点年份的指定日期区间汇总降雨量
首先先确认你的模拟降雨数据生成代码,我稍微调整了参数写法让逻辑更清晰:
set.seed(123) # 生成10个站点、10年(2001-2010)的逐日降雨数据 df <- data.frame( loc.id = rep(1:10, each = 10*365), years = rep(rep(2001:2010, each = 365), times = 10), day = rep(rep(1:365, times = 10), times = 10), rain = runif(n = 10*10*365, min = 0, max = 35) )
接下来构造你的参考数据框df.ref,这里我假设index2为300(你可以直接替换成实际业务中的日期值):
# 构造参考数据框:每个站点每年对应一个日期区间(index1到index2) df.ref <- data.frame( loc.id = rep(1:10, each = 10), years = rep(2001:2010, times = 10), index1 = rep(250, times = 10*10), index2 = rep(300, times = 10*10) # 替换为你的实际index2数值 )
下面提供两种实现指定区间降雨量求和的方案:
方法1:使用dplyr(简洁直观)
先加载dplyr包,通过连接数据框、过滤日期区间、分组求和完成需求:
library(dplyr) # 合并数据框→过滤日期区间→分组计算降雨量总和 rain_sum <- df %>% inner_join(df.ref, by = c("loc.id", "years")) %>% filter(day >= index1, day <= index2) %>% group_by(loc.id, years, index1, index2) %>% summarise(total_rain = sum(rain), .groups = "drop") # 查看前6行结果 head(rain_sum)
方法2:使用Base R(无需额外包)
如果不想加载第三方包,可以用base R的原生函数实现:
# 合并两个数据框 merged_df <- merge(df, df.ref, by = c("loc.id", "years")) # 筛选出日期在指定区间内的数据 filtered_df <- merged_df[merged_df$day >= merged_df$index1 & merged_df$day <= merged_df$index2, ] # 按站点、年份和区间分组求和 rain_sum_base <- aggregate(rain ~ loc.id + years + index1 + index2, data = filtered_df, sum) names(rain_sum_base)[names(rain_sum_base) == "rain"] <- "total_rain" # 查看前6行结果 head(rain_sum_base)
两种方案最终都会输出每个站点每年对应日期区间的降雨量总和,结果完全一致。
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

