J'ai un vecteur avec des valeurs NA
que je voudrais remplacer par un nouveau niveau de facteur 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
Cela fonctionne, mais cela semble être une façon étrange de le faire.
a = as.factor(ifelse(is.na(a), "NA", a))
class(a)
[1] "factor"
C'est la sortie attendue:
a
[1] 1 1 2 2 3 NA
Levels: 1 2 3 NA
Vous pouvez utiliser addNA()
.
x <- c(1, 1, 2, 2, 3, NA)
addNA(x)
# [1] 1 1 2 2 3 <NA>
# Levels: 1 2 3 <NA>
Il s'agit essentiellement d'une fonction pratique pour l'affacturage avec exclude = NULL
. De help(factor)
-
addNA
modifie un facteur en transformantNA
en un niveau supplémentaire (pour que les valeurs deNA
soient comptées dans les tableaux, par exemple).
Donc, une autre raison pour laquelle c'est Nice est parce que si vous avez déjà un facteur f
, vous pouvez utiliser addNA()
pour ajouter rapidement NA
comme niveau de facteur sans changer f
. Comme mentionné dans la documentation, c'est pratique pour les tableaux. Il se lit également très bien.
Définissez l'argument d'exclusion sur NULL pour inclure les NA en tant que niveaux (et utilisez le facteur au lieu de as.factor. Fait la même chose et a plus d'arguments à définir):
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>
Vous pouvez ajouter le NA en tant que niveau et changer le nom du niveau en quelque chose de plus explicite que <NA>
en utilisant fct_explicit_na
du paquet forcats.
library(forcats)
Par défaut, vous obtenez le nouveau niveau comme (Missing)
:
fct_explicit_na(a)
[1] 1 1 2 2 3 (Missing)
Levels: 1 2 3 (Missing)
Vous pouvez le définir sur autre chose:
fct_explicit_na(a, "unknown")
[1] 1 1 2 2 3 unknown
Levels: 1 2 3 unknown