Delete columns where all values are 0

前端 未结 3 2089
遥遥无期
遥遥无期 2020-12-08 22:44

I have a numeric matrix with 15000 columns. I want to completely remove the columns where all values are 0.

     col1     c         


        
相关标签:
3条回答
  • 2020-12-08 23:21

    How about this, using apply and all:

    M <- as.matrix(data.frame(a=runif(10),b=rep(0,10),c=runif(10),d=rep(0,10)))
    
    M[,which(!apply(M,2,FUN = function(x){all(x == 0)}))]
    
    0 讨论(0)
  • 2020-12-08 23:21

    A quicker way to do the same (3 - 5x faster) would be

    M[,colSums(M^2) !=0]
    

    EDIT: Added timing details of various approaches suggested here. The approach suggested by @Dwin using M[, colSums(abs(M)) ! == 0] seems to work fastest, especially when the matrix is large. I will update the benchmarking report if other solutions are suggested.

    m <- cbind(rnorm(1000),0)
    M <- matrix(rep(m,7500), ncol=15000)
    
    f_joran   = function(M) M[, !apply(M==0,2,all)]
    f_ramnath = function(M) M[, colSums(M^2) != 0]
    f_ben     = function(M) M[, colSums(M==0) != ncol(M)]
    f_dwin    = function(M) M[, colSums(abs(M)) != 0]
    
    library(rbenchmark)
    benchmark(f_joran(M), f_ramnath(M), f_ben(M), f_dwin(M), 
       columns = c('test', 'elapsed', 'relative'), 
       order = 'relative', replications = 10)
    
    
              test elapsed relative
    4    f_dwin(M)  11.699 1.000000
    2 f_ramnath(M)  12.056 1.030515
    1   f_joran(M)  26.453 2.261133
    3     f_ben(M)  28.981 2.477220
    
    0 讨论(0)
  • 2020-12-08 23:40

    You mention 15,000 columns but not the number of rows. If there are several thousand rows and speed is a concern, colSums will be quite a bit faster than apply.

    m <- cbind(rnorm(1000),0)
    M <- matrix(rep(m,7500), ncol=15000)
    system.time(foo <- M[,which(!apply(M==0,2,all))])
    #   user  system elapsed 
    #   1.63    0.23    1.86 
    system.time(bar <- M[,colSums(M)!=0])
    #   user  system elapsed 
    #  0.340   0.060   0.413
    identical(foo,bar)
    # [1] TRUE
    
    0 讨论(0)
提交回复
热议问题