2014-11-28 16 views
16

Ho un vettore con valori NA che vorrei sostituire con un nuovo livello di fattore NA.Converti NA in un livello di fattore

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

Questo funziona, ma sembra uno strano modo per farlo.

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

Questo è il risultato atteso:.

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

Vuoi mantenere un 'NA' o un' "NA" 'nei livelli e nel vettore? Forse, invece di 'as.character' potresti aver voluto' paste'? –

risposta

29

È inoltre possibile utilizzare addNA().

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

questo è fondamentalmente una funzione di convenienza per factoring con exclude = NULL. Da help(factor) -

addNA modifica un fattore girando NA in un ulteriore livello (in modo che NA valori sono conteggiati nelle tabelle, per esempio).

Così un altro motivo per cui questo è bello perché se si dispone già di un fattore f, è possibile utilizzare addNA() per aggiungere rapidamente NA come livello di fattore senza cambiare f. Come menzionato nella documentazione, questo è utile per le tabelle. Legge anche bene.

9

Impostare la esclude argomento a NULL per includere NAS come livelli (e fattore di utilizzo, invece di as.factor fa la stessa cosa e ha più argomenti per set):

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

è possibile aggiungere il NA come un livello e cambiare il nome del livello a qualcosa di più esplicito di quanto <NA> utilizzando fct_explicit_na dal pacchetto Forcats.

library(forcats) 

Per impostazione predefinita, si ottiene il nuovo livello come (Missing):

fct_explicit_na(a) 

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

è possibile impostarlo a qualcos'altro:

fct_explicit_na(a, "unknown") 

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