You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:21:16