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
相关产品推荐
相关产品推荐

