Skip to content

hasNA() / anyNA()?

4 messages · Henrik Bengtsson, Michael Cassin, Kurt Hornik +1 more

#
Hi,

is there a hasNA() / an anyNA() function in R?  Of course,

hasNA <- function(x) {
  any(is.na(x));
}

would do, but that would scan all elements in 'x' and then do the
test.  I'm looking for a more efficient implementation that returns
TRUE at the first NA, e.g.

hasNA <- function(x) {
  for (kk in seq(along=x)) {
    if (is.na(x[kk]))
      return(TRUE);
  }
  FALSE;
}

Cheers

Henrik
#
Patterned after Common Lisp's position(), ideally we would have formals
(x, FUN, right = FALSE) where the last argument controls whether the
search proceeds from left to right or right to left.

This would certainly be very nice to have, and make it trivial to
provide an efficient variant of Common Lisp's find() (which finds the
first element from the left or right for which the predicate gives
true).

-k

            

        
#
S-PLUS has an anyMissing() function, for which the default is:

anyMissing.default <-
function(x){
	(length(which.na(x)) > 0)
}

This is more efficient than any(is.na(x)) in the usual case that there
are few or no missing values.  There are methods for vectors that drop
to C code, and methods for data frames and other classes.

The code below seems to presume a list, and would be very slow for vectors.

For reasons of consistency between S-PLUS and R, I would ask that an R
function be called anyMissing rather than hasNA or anyNA.

Tim Hesterberg