我想在一组表格或页面之间的三维数组中对元素进行平均化(我的名字是第三维度)。
下面是一个名为my.array
的示例数组。在本例中,我希望在3张给出desired.result
的组中平均元素。我的实际数据在一个数组中,有几十张床单。
我怀疑有一个apply
-like函数可以进行平均。但是,我不熟悉在数组上使用这些函数。谢谢你的建议。
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
我更喜欢R基地的解决方案。
发布于 2014-03-13 00:05:37
用所需的数组包装sapply
调用怎么样?它只使用R基函数。
> array(sapply(seq(1,2), function(i) {
apply( my.array[,,(3*(i-1)+1):(3*i)], c(1,2), mean)
}), c(i,j,k/3))
发布于 2014-03-12 23:47:04
一种可能性是使用一个因素来识别"sheets“组,并使用abind包中的abind字体:
res <- tapply(1:(dim(my.array)[3]), gl(2,3), function(x) rowMeans(my.array[,,x], dim=2))
res <- do.call(abind, c(res, along=3))
HTH
https://stackoverflow.com/questions/22371988
复制相似问题