63

Possible Duplicate:
Removing empty rows of a data file in R

How would I remove rows from a matrix or data frame where all elements in the row are NA?

So to get from this:

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]   NA   NA   NA
[3,]    3    8   13
[4,]    4   NA   NA
[5,]    5   10   NA

to this:

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    3    8   13
[3,]    4   NA   NA
[4,]    5   10   NA

Because the problem with na.omit is that it removes rows with any NAs and so would give me this:

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    3    8   13

The best I have been able to do so far is use the apply() function:

> x[apply(x, 1, function(y) !all(is.na(y))),]
     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    3    8   13
[3,]    4   NA   NA
[4,]    5   10   NA

but this seems quite convoluted (is there something simpler that I am missing?)....

Thanks.

Community
  • 1
  • 1
Thomas Browne
  • 23,824
  • 32
  • 78
  • 121

2 Answers2

84

Solutions using rowSums() generally outperform apply() ones:

m <- structure(c( 1,  NA,  3,  4,  5, 
                  6,  NA,  8, NA, 10, 
                 11,  NA, 13, NA, NA), 
               .Dim = c(5L, 3L))

m[rowSums(is.na(m)) != ncol(m), ]

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    3    8   13
[3,]    4   NA   NA
[4,]    5   10   NA
divibisan
  • 11,659
  • 11
  • 40
  • 58
IRTFM
  • 258,963
  • 21
  • 364
  • 487
47

Sweep a test for all(is.na()) across rows, and remove where true. Something like this (untested as you provided no code to generate your data -- dput() is your friend):

 R> ind <- apply(X, 1, function(x) all(is.na(x)))
 R> X <- X[ !ind, ]
Ben
  • 41,615
  • 18
  • 132
  • 227
Dirk Eddelbuettel
  • 360,940
  • 56
  • 644
  • 725