2014-11-28 34 views
16

Mam wektor z wartościami NA, który chciałbym zastąpić nowym poziomem czynnikowym NA.Konwertuj NA na poziom czynnika

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 wygląda na to dziwny sposób.

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

to oczekiwany wynik.

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

chcesz zachować 'NA' lub od' "NA" 'na poziomach iw wektorze? Być może zamiast "as.character" mógłbyś chcieć 'paste'? –

Odpowiedz

29

Można również 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 wygodna funkcja do faktoringu z exclude = NULL. Od help(factor) -

addNA modyfikuje czynnik obracając NA na dodatkowym poziomie (tak, że NA wartości liczone są w tabelach, na przykład).

więc kolejny powód, to jest miłe, ponieważ jeśli masz już czynnik f, można użyć addNA() szybko dodać NA jako poziom czynnika bez zmiany f. Jak wspomniano w dokumentacji, jest to przydatne w przypadku tabel. To również ładnie się czyta.

9

Ustaw wyklucza argument NULL zawierać poziomy (NAS jak i czynnik użyty zamiast as.factor robi to samo i ma więcej argumentów do zestaw):

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> 
9

Możesz dodać NA jako poziom i zmiany nazwy poziom do czegoś bardziej wyraźne niż <NA> użyciu fct_explicit_na z pakietu Forcats.

library(forcats) 

Domyślnie pojawi się nowy poziom jako (Missing):

fct_explicit_na(a) 

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

Można ustawić go na coś innego:

fct_explicit_na(a, "unknown") 

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