【问题标题】:average array elements by groups按组平均数组元素
【发布时间】: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 中的解决方案。

【问题讨论】:

    标签: arrays r apply


    【解决方案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))
    

    【讨论】:

      【解决方案2】:

      一种可能性是使用一个因子来识别“工作表”组并使用 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

      【讨论】:

        猜你喜欢
        • 2022-01-11
        • 2013-12-29
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多