R语言实现经纬度宽表日度数据聚合计算多年月均值
日度数据转跨年月度均值实现方案
针对宽格式存储的多年日度站点观测数据,最稳妥高效的方式是先转长格式再分组聚合,完全不需要手动匹配列范围,适配任意时间跨度的数据集,不会出现列数错位问题。
可直接运行的实现代码(基于data.table,适配提供的测试数据结构)
library(data.table) # 宽转长:保留经纬度标识列,将所有日期列转换为行存储 dt_long <- melt( dt, id.vars = c("lon", "lat"), variable.name = "date_str", value.name = "daily_val" ) # 转换日期格式,自动提取年、月维度 dt_long[, `:=`( date = as.Date(date_str), year = year(as.Date(date_str)), month = month(as.Date(date_str)) )] # 第一步:按 经纬度+年+月 分组,计算各年各月的日值总和 dt_monthly_sum <- dt_long[, .(mon_sum = sum(daily_val, na.rm = TRUE)), by = .(lon, lat, year, month)] # 第二步:按 经纬度+月份 分组,计算所有年份同月的算术平均值,再转回宽格式 dt_result <- dcast( dt_monthly_sum[, .(mon_mean = mean(mon_sum, na.rm = TRUE)), by = .(lon, lat, month)], lon + lat ~ month, value.var = "mon_mean" ) # 重命名月份列,最终得到lon、lat加1-12月共14列的结果 setnames(dt_result, old = as.character(1:12), new = paste0("month_", 1:12))
方案优势
- 无需手动统计每个月对应的列索引,闰年、跨年、不同月份天数差异会自动适配,不会出现列匹配错误
- 聚合逻辑基于data.table底层C实现,运算效率比逐行
apply选列求和高1~2个数量级,适配高维度大型数据集 - 自动处理缺失值:
na.rm = TRUE参数会自动跳过空值计算,不需要额外做缺失值预处理 - 如果需要调整统计逻辑(比如把求和改成求月均值、月最大值),只需要修改聚合函数里的
sum/mean即可,不用调整其他代码
内容的提问来源于stack exchange,提问作者mikaeldp
相关产品推荐
相关产品推荐

