Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete columns where all values are 0

Tags:

r

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

     col1     col2     col3     col4
row1  1        0        0        1
row2  3.4      0        0        2.4
row3  0.56     0        0        0
row4  0        0        0        0
 

Here I want to delete columns col2 and col3, and keep the rest. How can I do it with R? Thanks

like image 647
y2p Avatar asked Jul 09 '11 01:07

y2p


People also ask

How do I get rid of empty columns?

Go to Home tab. Select the Delete dropdown menu under the Cells tools group. Select Delete Cells. Select Shift cells left for removing and rearranging columns.


2 Answers

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
like image 102
Ramnath Avatar answered Nov 02 '22 00:11

Ramnath


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)}))]
like image 44
joran Avatar answered Nov 01 '22 22:11

joran