Delete columns where all values are 0

前端 未结 3 2090
遥遥无期
遥遥无期 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

    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
    

提交回复
热议问题