Przelicz NA na poziom czynnika

Mam wektor z wartościami NA, które chciałbym zastąpić nowym poziomem czynnika 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
To działa, ale wydaje się, że to dziwny sposób.
a = as.factor(ifelse(is.na(a), "NA", a))
class(a)
[1] "factor"

To jest oczekiwany wynik:

a
[1] 1  1  2  2  3  NA
Levels: 1 2 3 NA
Author: Rich Scriven, 2014-11-28

3 answers

Możesz użyć addNA().

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

Jest to w zasadzie Funkcja wygodna dla faktoringu z exclude = NULL. Od help(factor)-

addNA modyfikuje współczynnik, zamieniając NA na dodatkowy poziom (tak, aby wartości NA były liczone np. w tabelach).

Innym powodem jest to, że jeśli masz już czynnik f, możesz użyć addNA(), aby szybko dodać NA jako poziom czynnika bez zmiany f. Jak wspomniano w dokumentacji, jest to przydatne na stoły. Też ładnie się czyta.

 57
Author: Rich Scriven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-11 18:25:01

Możesz dodać NA jako poziom i zmienić nazwę poziomu na bardziej jawną niż <NA> używając fct_explicit_naz pakietu forcats.

library(forcats)

Domyślnie otrzymujesz nowy poziom jako (Missing):

fct_explicit_na(a)

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

Możesz ustawić to na coś innego:

fct_explicit_na(a, "unknown")

[1] 1       1       2       2       3       unknown
Levels: 1 2 3 unknown
 20
Author: aosmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 18:28:20

Ustaw argument exclude na NULL, aby zawierał NAs jako poziomy (i użyj czynnika zamiast as.factor. Robi to samo i ma więcej argumentów do Ustawienia):

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>
 20
Author: LyzandeR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 15:24:48