我有一个维度数组[360,180,396]。这些维度是经度、纬度和33年月度数据的月-年。元素是该纬度/经度的百分比。
从这里,我想做一个汇总数组,我将在以后的分析中使用,而不默认使用for循环。我想得到所有33年的每个月数据的平均值,然后是所有年份的年平均值。这是我为包含数据而做的汇总数组的空白。
mca <- array(data = NA,
dim = c(360,180,13),
dimnames = list(lon,
lat,
c(month.abb, "Ann")))
下面是本例中较小的测试输入和输出数组
#input
set.seed(42)
smallin <- array(data = rnorm(n = 600, mean = 60, sd = 20),
dim = c(5, 5, 24))
#output to fill
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")))
基于我尝试的this question的第二个答案
jan <- apply(ca, c(seq(from = 1, to = 385, by = 12)), mean)
#also
ind_jan <- c(seq(from = 1, to = 385, by = 12))
jan <- apply(ca, ind_jan, mean)
我认为这相当于
jan <- apply(smallin, c(seq(from = 1, to = 13, by = 12)), mean)
考虑到保证金,我需要把我想要的第三维平均,但收到了错误:
应用中的误差(ca,c(seq(from = 1,to = 385,by = 12)),mean):'MARGIN'与dim(X)不匹配
我返回到上面的查询,realized margin = 1:2必须选择所有矩阵(维度1和2)。因此,使用它,我可以得到所有矩阵的平均值,它应该是我的输出数组[,,13]的百分比的年平均值。
smallout[,,13] <- apply(smallin, 1:2, mean)
但我还是不知道如何从1开始,然后从2开始,然后从3开始,平均每12个矩阵...
我已经阅读了apply文档,但发现它在这种情况下毫无帮助/令人费解。所有提出的建议问题似乎都是用Python(或其他语言)编写的。
我也不确定我是否可以一次完成所有这些,或者像上面一样通过索引将一个矩阵传递到输出数组。
我能想到的最接近的是
ind_jan <- c(seq(from = 1, to = 13, by = 12))
smallout[,,1] <- apply(smallin[,,c(ind_jan)], 1:2, mean)
对数组中的每个输出矩阵重复。有没有更少手动/更有效/更好的方法?
3条答案
按热度按时间vbopmzt11#
考虑这个简化的数组
A
(参见下面的数据)。我们可以使用
sapply
来“循环”这些年,使用simplify='array'
选项来返回一个年平均值数组。以及相应的历年每月平均数:
4nkexdtk2#
您可以通过拆分最后一个维度(包含月和年)来将月和年的维度分开,从而向数组中添加另一个维度。
有了这个,你可以得到所有年份每个月的平均值:
单年平均值:
所有年份的年平均值:
xmd2e60i3#
我相信有一个更好的方法,如果有人有它,我仍然热衷于学习,但下面的结果是工作,一旦我弄清楚如何做索引,以选择每个月的数据,以采取平均使用应用。