Преобразование NA в факторный уровень

У меня есть вектор с NA значениями, которые я бы хотел заменить новым уровнем уровня NA.

a = as.factor(as.character(c(1, 1, 2, 2, 3, NA)))
a
[1] 1    1    2    2    3    <NA>
Levels: 1 2 3

Это работает, но это кажется странным способом сделать это.

a = as.factor(ifelse(is.na(a), "NA", a))
class(a)
[1] "factor"

Это ожидаемый результат:

a
[1] 1  1  2  2  3  NA
Levels: 1 2 3 NA

Ответы

Ответ 1

Вы также можете использовать addNA().

x <- c(1, 1, 2, 2, 3, NA)
addNA(x)
# [1] 1    1    2    2    3    <NA>
# Levels: 1 2 3 <NA>

Это в основном удобная функция для факторинга с exclude = NULL. Из help(factor) -

addNA изменяет коэффициент, поворачивая NA на дополнительный уровень (так что значения NA подсчитываются, например, в таблицах).

Итак, другая причина в том, что, если у вас уже есть коэффициент f, вы можете использовать addNA(), чтобы быстро добавить NA как факторный уровень без изменения f. Как указано в документации, это удобно для таблиц. Он также хорошо читается.

Ответ 2

Установите аргумент exclude в NULL, чтобы включить NA в качестве уровней (и использовать коэффициент вместо as.factor. Делает то же самое и имеет больше аргументов):

a = factor(as.character(c(1, 1, 2, 2, 3, NA)), exclude = NULL)

> a
[1] 1    1    2    2    3    <NA>
Levels: 1 2 3 <NA>

Ответ 3

Вы можете добавить NA как уровень и изменить имя уровня на более явное, чем <NA>, используя fct_explicit_na из пакетов forcats.

library(forcats)

По умолчанию вы получаете новый уровень как (Missing):

fct_explicit_na(a)

[1] 1         1         2         2         3         (Missing)
Levels: 1 2 3 (Missing)

Вы можете установить его на что-то еще:

fct_explicit_na(a, "unknown")

[1] 1       1       2       2       3       unknown
Levels: 1 2 3 unknown