代码之家  ›  专栏  ›  技术社区  ›  ostionalzax

删除包含所有零的数组层

  •  2
  • ostionalzax  · 技术社区  · 10 年前

    我正在尝试删除包含所有零的数组的一层。下面是一个示例:

    ii = c(25, 9, 0, 6, 19, 30, 13, 27, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 15, 7, 0, 18, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 43, 33, 40, 34, 42)
    key = array(ii,dim=c(3,3,5))
    

    最终结果相当于 key[,,-c(2,4)] key[,,c(1,3,5)] 。我看到了 this question 但它只能做一行或一列。有没有办法做一整层?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  4
  •   thelatemail    8 年前

    一个想法是,利用 apply 可以处理任意行组合( MARGIN = 1 ),列( MARGIN = 2 )地层( MARGIN = 3 )以及更高的尺寸( MARGIN= 4 以及更大)。

    key[,,!apply(key,3,function(x) all(x == 0) )]
    #or more simply:
    key[,,apply(key,3,function(x) any(x != 0) )]
    #or simpler again:
    key[,,apply(key != 0, 3, any)]
    
    #, , 1
    # 
    #     [,1] [,2] [,3]
    #[1,]   25    6   13
    #[2,]    9   19   27
    #[3,]    0   30    4
    #
    #, , 2
    # 
    #     [,1] [,2] [,3]
    #[1,]    1    0    0
    #[2,]    0   15   18
    #[3,]    0    7   16
    #
    #, , 3
    #
    #     [,1] [,2] [,3]
    #[1,]    0    0   40
    #[2,]    0   43   34
    #[3,]   39   33   42