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 neededclipper <- 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
On Apr 17, 2015, at 5:23 PM, Luigi Marongiu <marongiu.luigi at 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 NAHi, 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
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_schwartz at me.com> wrote:> On Apr 17, 2015, at 5:23 PM, Luigi Marongiu <marongiu.luigi at 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 >