【发布时间】:2014-04-17 19:05:47
【问题描述】:
我想在工作表或页面组之间平均一个 3 维数组中的元素(我的名字是第三维)。
下面是一个名为my.array 的示例数组。在这个例子中,我想对 3 张纸组中的元素进行平均,给出desired.result。我的实际数据在一个有几十张表的数组中。
我怀疑有一个类似apply 的函数可以进行平均。但是,我不熟悉在数组上使用这些函数。谢谢你的建议。
i <- 4
j <- 4
k <- 6
my.array <- array(0, c(i,j,k))
my.array[1:2,1:2,1] <- 1
my.array[1:2,3:4,1] <- 2
my.array[3:4,1:2,1] <- 3
my.array[3:4,3:4,1] <- 4
my.array[1:2,1:2,2] <- 10
my.array[1:2,3:4,2] <- 20
my.array[3:4,1:2,2] <- 30
my.array[3:4,3:4,2] <- 40
my.array[1:2,1:2,3] <- 100
my.array[1:2,3:4,3] <- 200
my.array[3:4,1:2,3] <- 300
my.array[3:4,3:4,3] <- 400
my.array[1:2,1:2,4] <- -4
my.array[1:2,3:4,4] <- -3
my.array[3:4,1:2,4] <- -2
my.array[3:4,3:4,4] <- -1
my.array[1:2,1:2,5] <- 80
my.array[1:2,3:4,5] <- 70
my.array[3:4,1:2,5] <- 60
my.array[3:4,3:4,5] <- 50
my.array[1:2,1:2,6] <- 111
my.array[1:2,3:4,6] <- 222
my.array[3:4,1:2,6] <- 333
my.array[3:4,3:4,6] <- 444
desired.result <- array(0, c(i,j,k/3))
desired.result[1:2,1:2,1] <- 37 # 111 / 3
desired.result[1:2,3:4,1] <- 74 # 222 / 3
desired.result[3:4,1:2,1] <- 111 # 333 / 3
desired.result[3:4,3:4,1] <- 148 # 444 / 3
desired.result[1:2,1:2,2] <- 62.33333 # (111 + 80 + -4) / 3
desired.result[1:2,3:4,2] <- 96.33333 # (222 + 70 + -3) / 3
desired.result[3:4,1:2,2] <- 130.3333 # (333 + 60 + -2) / 3
desired.result[3:4,3:4,2] <- 164.3333 # (444 + 50 + -1) / 3
, , 1
[,1] [,2] [,3] [,4]
[1,] 37 37 74 74
[2,] 37 37 74 74
[3,] 111 111 148 148
[4,] 111 111 148 148
, , 2
[,1] [,2] [,3] [,4]
[1,] 62.33333 62.33333 96.33333 96.33333
[2,] 62.33333 62.33333 96.33333 96.33333
[3,] 130.33330 130.33330 164.33330 164.33330
[4,] 130.33330 130.33330 164.33330 164.33330
这段代码很接近:
t(sapply(seq(1,2), function(i) {apply( my.array[,,(3*(i-1)+1):(3*i)], c(1,2), mean)}))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,] 37.00000 37.00000 111.0000 111.0000 37.00000 37.00000 111.0000 111.0000 74.00000 74.00000 148.0000 148.0000 74.00000 74.00000 148.0000 148.0000
[2,] 62.33333 62.33333 130.3333 130.3333 62.33333 62.33333 130.3333 130.3333 96.33333 96.33333 164.3333 164.3333 96.33333 96.33333 164.3333 164.3333
我更喜欢 base R 中的解决方案。
【问题讨论】: