[R] Handling NA values in a if statement

Luigi Marongiu marongiu.luigi at gmail.com
Sun Apr 19 10:17:11 CEST 2015


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
>



More information about the R-help mailing list