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

R语言:无循环实现数组每12个矩阵逐元素平均及年度均值计算

R语言:无循环实现多年月度数组的月度均值与年度均值计算

问题背景

我有一个维度为[360, 180, 396]的数组,分别代表经度、纬度以及33年的月度数据(第三维度为年月维度),元素为对应经纬度的百分比数值。我需要在不使用for循环的前提下生成一个汇总数组,计算各月份在33年中的逐元素均值,以及所有年份的年度均值。已创建好存储结果的空数组:

mca <- array(data = NA, 
             dim = c(360,180,13), 
             dimnames = list(lon, 
                             lat, 
                             c(month.abb, "Ann")))

测试数据

提供小样本测试输入与输出数组用于验证:

# 输入数组(5*5*24,对应2年的月度数据)
set.seed(42)
smallin <- array(data = rnorm(n = 600, mean = 60, sd = 20),
               dim = c(5, 5, 24))

# 待填充的输出数组(5*5*13,12个月度均值+1个年度均值)
smallout <- array(data = NA, 
             dim = c(5,5,13), 
             dimnames = list(c("1", "2", "3", "4", "5"), 
                             c("-89.5", "-88.5", "-87.5", "-86.5", "-85.5"), 
                             c(month.abb, "Ann")))

尝试过的方法与问题

我曾尝试以下代码,误以为apply的MARGIN参数需要传入要平均的第三维度索引:

# 尝试计算1月均值(针对全量数据)
jan <- apply(ca, c(seq(from = 1, to = 385, by = 12)), mean)

# 小样本对应写法
jan <- apply(smallin, c(seq(from = 1, to = 13, by = 12)), mean)

但出现错误:

Error in apply(ca, c(seq(from = 1, to = 385, by = 12)), mean) :
'MARGIN' does not match dim(X)

之后意识到margin=1:2是指定按前两个维度(经纬度)做逐元素计算,用这种方法可以正确算出年度均值:

smallout[,,13] <- apply(smallin, 1:2, mean)

但我不清楚如何高效地分别对第1、2……12个开始的每12个矩阵做逐元素平均。目前只能手动对每个月份重复类似操作:

ind_jan <- c(seq(from = 1, to = 13, by = 12))
smallout[,,1] <- apply(smallin[,,c(ind_jan)], 1:2, mean)

需求

请问是否存在更高效、无需手动重复的实现方式?

内容的提问来源于stack exchange,提问作者The_Tams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:23:13