This is a translation of the SQL command NULLIF
. It is useful if you want
to convert an annoying value to NA
.
na_if(x, y)
Vector to modify
Value or vector to compare against. When x
and y
are equal, the
value in x
will be replaced with NA
.
y
is cast to the type of x
before
comparison.
y
is recycled to the size of x
before
comparison. This means that y
can be a vector with the same size as x
,
but most of the time this will be a single value.
A modified version of x
that replaces any values that
are equal to y
with NA
.
coalesce()
to replace missing values with a specified
value.
tidyr::replace_na()
to replace NA
with a value.
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 gender
#> <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
#> 1 Luke Sk… 172 77 blond fair blue 19 male mascu…
#> 2 C-3PO 167 75 NA gold yellow 112 none mascu…
#> 3 R2-D2 96 32 NA white, bl… red 33 none mascu…
#> 4 Darth V… 202 136 none white yellow 41.9 male mascu…
#> 5 Leia Or… 150 49 brown light brown 19 fema… femin…
#> 6 Owen La… 178 120 brown, gr… light blue 52 male mascu…
#> 7 Beru Wh… 165 75 brown light blue 47 fema… femin…
#> 8 R5-D4 97 32 NA white, red red NA none mascu…
#> 9 Biggs D… 183 84 black light brown 24 male mascu…
#> 10 Obi-Wan… 182 77 auburn, w… fair blue-gray 57 male mascu…
#> # ℹ 77 more rows
#> # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#> # vehicles <list>, starships <list>