我有一个维度为[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")))
根据这个问题的第二个答案,我尝试了
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)
考虑到边距,我需要放置第三个维度以进行平均,但是出现了错误:
apply(ca, c(seq(from = 1, to = 385, by = 12)), mean) 中的错误: 'MARGIN' does not match dim(X)
我回到上面的查询并意识到 margin = 1:2 必须选择每个矩阵的所有部分(尺寸为 1 和 2)。因此,使用它,我可以得到所有矩阵的平均值,这应该是输出数组 [,,13] 的年平均百分比。
smallout[,,13] <- apply(smallin, 1:2, mean)
但我仍然不知道如何让它从第1个矩阵开始,每12个矩阵取平均值,然后从第2个矩阵开始,再从第3个矩阵开始...
我已经阅读了apply文档,但在这种情况下/难以理解。所有建议的问题似乎都是用Python(或其他语言)。
我也不确定是否可以一次完成所有操作,还是通过索引将矩阵逐个传递到输出数组中。
我能想到的最接近的方法是类似于
ind_jan <- c(seq(from = 1, to = 13, by = 12))
smallout[,,1] <- apply(smallin[,,c(ind_jan)], 1:2, mean)
对于数组中的每个输出矩阵重复。是否有更少手动/更高效/更好的方法?
NA
,然后展示该示例输入的期望输出?我认为这将使您和我们更容易理解正在发生的事情,并为我们提供可测试的东西。 - Gregor Thomas