2014-03-13 74 views
1

我想平均在一組三維數組中的圖元或頁面組中的元素(我的名字爲第三維)。按組的平均數組元素

下面是一個名爲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 

我更喜歡在基R.溶液

回答

1

那麼用所需的數組打包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)) 
1

一個可能性是使用,將確定「片」的基團,並使用一個因子abind從封裝fonction 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