web-dev-qa-db-fra.com

Convertir NA en un niveau de facteur

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
32
marbel

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 transformant NA en un niveau supplémentaire (pour que les valeurs de NA 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.

49
Rich Scriven

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>
17
LyzandeR

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
16
aosmith