Преобразование 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