score324
score324

Reputation: 717

How to use NA in if..else if statement in R

I created this small example. I want to print some values, for example, B for NA values using the if else statement.

x = c(1,7,NA, 3, NA, NA)

for(i in 1: length(x)){
  y = x[i]
  if(y == 1){
    print("A")
  }
  else if(y == 'NA'){
    print("B")
  }
  else{
    print("C")
  }
}

I am getting an error message Error in if (y == 1) { : missing value where TRUE/FALSE needed Why can't I print B for NA values? How to use NA within the if else statement?

Upvotes: 1

Views: 431

Answers (3)

Ronak Shah
Ronak Shah

Reputation: 388862

You can use vectorized way using case_when or nested ifelse -

dplyr::case_when(is.na(x) ~ 'B', 
                 x == 1 ~ 'A', 
                 TRUE ~ 'C')

#[1] "A" "C" "B" "C" "B" "B"

Upvotes: 1

akrun
akrun

Reputation: 886998

The issue is also that == with NA returns NA and not FALSE. Make sure to add a condition to check NA as well. Also, y == 'NA' should be replaced with is.na(y)

for(i in 1:length(x)){
  y = x[i]
  if(y == 1 & !is.na(y)){
    print("A")
  }
  else if(is.na(y)){
    print("B")
  }
  else{
    print("C")
  }
}

-output

[1] "A"
[1] "C"
[1] "B"
[1] "C"
[1] "B"
[1] "B"

Or this can be done in a vectorized way

c("C", "B", "A")[1 + is.na(x) + 2 *(x %in% 1)]
#[1] "A" "C" "B" "C" "B" "B"

Upvotes: 1

Onyambu
Onyambu

Reputation: 79208

To avoid repetition, ensure that the first block checks for NA:

x = c(1,7,NA, 3, NA, NA)

for(i in 1: length(x)){
  y = x[i]
  if(is.na(y)){
    print("B")
  }
  else if(y == 1){
    print("A")
  }
  else{
    print("C")
  }
}

[1] "A"
[1] "C"
[1] "B"
[1] "C"
[1] "B"
[1] "B"

Upvotes: 1

Related Questions