Dear David and Mark, thank you for your reply. I have implemented the suggestions you have made in the following: 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(is.finite(x[i]) < ll & is.finite(x[i]) > ul) { x[i] <- NA } else if (is.infinite(x[i]) == "TRUE") { x[i] <- NA } else { x[i] <- x[i] } } return(x) } (X<-clipper(x, ll, ul)) that works all right. Best regards Luigi On Fri, Apr 17, 2015 at 11:43 PM, Marc Schwartz <marc_schwa...@me.com> wrote: > On Apr 17, 2015, at 5:23 PM, Luigi Marongiu <marongiu.lu...@gmail.com> wrote: >> >> 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 > > > Hi, > > Something along the lines of: > >> subset(x, is.finite(x) & (x > ll) & (x < ul)) > [1] 5.90 6.08 4.35 4.79 3.64 16.42 4.37 4.78 3.71 32.59 4.01 > [12] 35.36 3.17 1.61 2.90 4.67 4.10 5.35 32.55 1.17 34.14 4.42 > [23] 1.76 7.08 17.81 > > or: > >> x[is.finite(x) & (x > ll) & (x < ul)] > [1] 5.90 6.08 4.35 4.79 3.64 16.42 4.37 4.78 3.71 32.59 4.01 > [12] 35.36 3.17 1.61 2.90 4.67 4.10 5.35 32.55 1.17 34.14 4.42 > [23] 1.76 7.08 17.81 > > > See ?subset and ?is.finite: > >> is.finite(x) > [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE > [12] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE > [23] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE > [34] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE > > > Regards, > > Marc Schwartz > ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.