This is a translation of the SQL command NULLIF. It is useful if you want
to convert an annoying value to NA.
Arguments
- x
Vector to modify
- y
Value or vector to compare against. When
xandyare equal, the value inxwill be replaced withNA.yis cast to the type ofxbefore comparison.yis recycled to the size ofxbefore comparison. This means thatycan be a vector with the same size asx, but most of the time this will be a single value.
See also
coalesce() to replace missing values with a specified
value.
tidyr::replace_na() to replace NA with a value.
Examples
na_if(1:5, 5:1)
#> [1] 1 2 NA 4 5
x <- c(1, -1, 0, 10)
100 / x
#> [1] 100 -100 Inf 10
100 / na_if(x, 0)
#> [1] 100 -100 NA 10
y <- c("abc", "def", "", "ghi")
na_if(y, "")
#> [1] "abc" "def" NA "ghi"
# `na_if()` allows you to replace `NaN` with `NA`,
# even though `NaN == NaN` returns `NA`
z <- c(1, NaN, NA, 2, NaN)
na_if(z, NaN)
#> [1] 1 NA NA 2 NA
# `na_if()` is particularly useful inside `mutate()`,
# and is meant for use with vectors rather than entire data frames
starwars %>%
select(name, eye_color) %>%
mutate(eye_color = na_if(eye_color, "unknown"))
#> # A tibble: 87 × 2
#> name eye_color
#> <chr> <chr>
#> 1 Luke Skywalker blue
#> 2 C-3PO yellow
#> 3 R2-D2 red
#> 4 Darth Vader yellow
#> 5 Leia Organa brown
#> 6 Owen Lars blue
#> 7 Beru Whitesun Lars blue
#> 8 R5-D4 red
#> 9 Biggs Darklighter brown
#> 10 Obi-Wan Kenobi blue-gray
#> # ℹ 77 more rows
# `na_if()` can also be used with `mutate()` and `across()`
# to alter multiple columns
starwars %>%
mutate(across(where(is.character), ~na_if(., "unknown")))
#> # A tibble: 87 × 14
#> name height mass hair_color skin_color eye_color birth_year sex
#> <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr>
#> 1 Luke … 172 77 blond fair blue 19 male
#> 2 C-3PO 167 75 NA gold yellow 112 none
#> 3 R2-D2 96 32 NA white, bl… red 33 none
#> 4 Darth… 202 136 none white yellow 41.9 male
#> 5 Leia … 150 49 brown light brown 19 fema…
#> 6 Owen … 178 120 brown, gr… light blue 52 male
#> 7 Beru … 165 75 brown light blue 47 fema…
#> 8 R5-D4 97 32 NA white, red red NA none
#> 9 Biggs… 183 84 black light brown 24 male
#> 10 Obi-W… 182 77 auburn, w… fair blue-gray 57 male
#> # ℹ 77 more rows
#> # ℹ 6 more variables: gender <chr>, homeworld <chr>, species <chr>,
#> # films <list>, vehicles <list>, starships <list>
