[R] Handling NA values in a if statement

Luigi Marongiu marongiu.luigi at gmail.com
Sat Apr 18 00:23:34 CEST 2015


Dear all,
I have a vector with a certain range of values including infinity and
NA. I would like to remove the values that are outside a given range
(lower level = ll and upper level = ul) but I am getting the error due
to the NA values (missing value where TRUE/FALSE needed). I then
included the !is.na() but now the resulting error is all NA, as in the
example.
In addition, here I have implemented a for loop to scan all the
elements of the vector, but I should be able to use the sapply();
however I don't know how to send the ll and ul arguments to sapply().
Could you please help?
best regards
Luigi

EXAMPLE

x <- c(-Inf,  Inf,    NA,    5.9,    6.08,    5281391136138.75,
4.35,    4.79,
       9474097322.96,    3.64,    16.42,    -12211.11,    4.37,
-1097.79,    4.78,
       3.71,    32.59,    4.01,    35.36,    3.17,    1.61,
-3678.28,    2.9,    4.67,
       4.1,    348410866.78,    5.35,    4.3101519459837E+016,
1467030866.75,
       1.10376094956278E+018,    32.55,    1.17,    5339028670388.94,
  34.14,
       33205967009.57,    4.42,    1.76,    7.08,    -8428.84,
-113491.08,    17.81)
ll <- 1
ul <- 45

clipper <- function(x, ll, ul) {
  for(i in 1:length(x)) {
    if(x[i] < ll) {
      x[i] <- NA
    } else if(x[i] > ul) {
      x[i] <- NA
    } else {
      x[i] <- x[i]
    }
  }
return(x)
}
(X<-clipper(x, ll, ul))
> missing value where TRUE/FALSE needed


clipper <- function(x, ll, ul) {
  for(i in 1:length(x)) {
    if(!is.na(x[i]) < ll) {
      x[i] <- NA
    } else if(!is.na(x[i]) > ul) {
      x[i] <- NA
    } else {
      x[i] <- x[i]
    }
  }
return(x)
}
(X<-clipper(x, ll, ul))

 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA
[28] NA NA NA NA NA NA NA NA NA NA NA NA NA NA



More information about the R-help mailing list