[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