数组中每第 12 个矩阵的逐元素平均值,一个序列重复 12 次,没有 for 循环

问题描述 投票:0回答:3

我有一个维度数组 [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)

考虑保证金我需要把我想要平均的第 3 个维度,但收到错误:

apply(ca, c(seq(from = 1, to = 385, by = 12)), mean) 错误: 'MARGIN' 不匹配 dim(X)

我回到上面的查询并意识到 margin = 1:2 必须选择所有每个矩阵(维度 1 和 2)。所以使用它我可以得到所有矩阵的平均值,它应该是我的输出数组 [,,13],

的年平均百分比
smallout[,,13] <- apply(smallin, 1:2, mean)

但我仍然不知道如何让它平均每 12 个矩阵从 1 开始,然后从 2 开始,然后从 3 开始......

我已经阅读了应用文档,但发现它在这种情况下没有帮助/难以理解。出现的所有建议问题似乎都是用 Python(或其他语言)编写的。

我也不确定我是否可以一次完成所有这些,或者通过上面的索引将一个矩阵一个矩阵传递给输出数组。

我能想到的最接近的东西是

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

对数组中的每个输出矩阵重复。有没有更少的手动/更有效/更好的方法?

r arrays mean
3个回答
1
投票

我确信有更好的方法,如果有人有它我仍然热衷于学习,但下面的结果证明是有效的,一旦我弄清楚如何进行索引以便仅选择每个月的数据来获取意味着使用应用。

mca[,,1] <- apply(ca[,,c(seq(from = 1, to = 396, by = 12))], 1:2, mean)
mca[,,2] <- apply(ca[,,c(seq(from = 2, to = 396, by = 12))], 1:2, mean)
mca[,,3] <- apply(ca[,,c(seq(from = 3, to = 396, by = 12))], 1:2, mean)
mca[,,4] <- apply(ca[,,c(seq(from = 4, to = 396, by = 12))], 1:2, mean)
mca[,,5] <- apply(ca[,,c(seq(from = 5, to = 396, by = 12))], 1:2, mean)
mca[,,6] <- apply(ca[,,c(seq(from = 6, to = 396, by = 12))], 1:2, mean)
mca[,,7] <- apply(ca[,,c(seq(from = 7, to = 396, by = 12))], 1:2, mean)
mca[,,8] <- apply(ca[,,c(seq(from = 8, to = 396, by = 12))], 1:2, mean)
mca[,,9] <- apply(ca[,,c(seq(from = 9, to = 396, by = 12))], 1:2, mean)
mca[,,10] <- apply(ca[,,c(seq(from = 10, to = 396, by = 12))], 1:2, mean)
mca[,,11] <- apply(ca[,,c(seq(from = 11, to = 396, by = 12))], 1:2, mean)
mca[,,12] <- apply(ca[,,c(seq(from = 12, to = 396, by = 12))], 1:2, mean)
mca[,,13] <- apply(ca, 1:2, mean)

1
投票

考虑这个简化的数组

A
(见下面的数据)。

str(A)
# int [1:2, 1:3, 1:6] 1 1 1 1 1 1 2 2 2 2 ...

我们可以使用

sapply
来“循环”这些年,并选择
simplify='array'
来返回一组 “每月”平均值.

yrs <- seq_len(dim(A)[3]/nm)
sapply(yrs, \(i) apply(A[, , i], 1:2, mean), simplify='array')
# , , 1
# 
#      [,1] [,2] [,3]
# [1,]    1    1    1
# [2,]    1    1    1
# 
# , , 2
# 
#      [,1] [,2] [,3]
# [1,]    2    2    2
# [2,]    2    2    2

因此,要获得“年度”平均值

mnt <- seq_len(nm)
sapply(mnt, \(i) apply(A[, , 1:nm + i - 1], 1:2, mean), simplify='array')
# , , 1
# 
#      [,1] [,2] [,3]
# [1,]    2    2    2
# [2,]    2    2    2
# 
# , , 2
# 
#      [,1] [,2] [,3]
# [1,]    2    2    2
# [2,]    2    2    2
# 
# , , 3
# 
#      [,1] [,2] [,3]
# [1,]    2    2    2
# [2,]    2    2    2

NB:请注意,如果我们在一个切片上进行子集化并且没有明确声明我们不想

drop
它,那么数组(就像矩阵)会丢失一维:

A[,,1, drop=FALSE]

资料:

nm <- 3  ## no. "months"  ## actually 12 months in real years
ny <- 2  ## no. "years"  ## in your case 33
A <- array(rep(1:nm, each=nm*ny), c(2, 3, nm*ny))  ## think this is your `ca`

1
投票

您可以通过拆分最后一个维度来向数组添加另一个维度,包含月份和年份以分隔月份和年份的维度。

i <- dim(smallin)
dim(smallin) <- c(i[1:2], 12L, i[3]/12L)

有了这个,您可以获得所有年份每个月的平均值:

apply(smallin, 1:3, mean)
#, , 1
#
#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 73.66338 58.35988 72.33907 62.19628 52.08766
#[2,] 61.95544 79.93891 75.27725 49.30859 44.07820
#[3,] 64.02119 68.98285 35.76780 35.06961 58.79089
#[4,] 73.67935 67.72028 50.90479 23.22819 72.14434
#[5,] 62.57796 59.03798 64.53486 83.65987 97.04576
#
#...
#
#, , 12
#
#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 83.55254 68.77645 48.88358 52.99573 56.82992
#[2,] 83.47723 39.02472 95.08051 65.97988 54.00097
#[3,] 47.59936 36.93396 38.35189 57.86126 83.99976
#[4,] 73.00906 53.71818 36.93229 80.85843 39.27094
#[5,] 81.67441 64.50031 62.71359 56.27758 54.01388

单年年均值:

apply(smallin, c(1,2,4), mean)
#, , 1
#
#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 60.77253 60.15417 54.71206 67.31820 62.05012
#[2,] 56.60298 59.14604 73.17469 57.66912 53.36540
#[3,] 56.52924 56.31096 58.73874 67.47850 59.06819
#[4,] 67.75999 56.45636 49.43743 55.14660 65.46497
#[5,] 60.28056 62.17656 55.08681 54.15788 60.05240
#
#, , 2
#
#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 60.55035 65.21223 59.92112 59.75500 69.77088
#[2,] 60.89782 54.59722 55.17699 59.06815 60.03906
#[3,] 58.85733 54.02893 47.31326 63.10434 59.56569
#[4,] 60.96362 61.82648 55.45109 54.50272 45.21176
#[5,] 59.94452 54.31497 60.64839 64.65777 80.86525

历年年均值:

apply(smallin, 1:2, mean)
#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 60.66144 62.68320 57.31659 63.53660 65.91050
#[2,] 58.75040 56.87163 64.17584 58.36864 56.70223
#[3,] 57.69329 55.16994 53.02600 65.29142 59.31694
#[4,] 64.36180 59.14142 52.44426 54.82466 55.33836
#[5,] 60.11254 58.24577 57.86760 59.40782 70.45883
© www.soinside.com 2019 - 2024. All rights reserved.