Sous-ensemble d'un facteur par NA les niveaux
-
14-11-2019 - |
Question
J'ai un facteur dans R, avec une NA niveau.
set.seed(1)
x <- sample(c(1, 2, NA), 25, replace=TRUE)
x <- factor(x, exclude = NULL)
> x
[1] 1 2 2 <NA> 1 <NA> <NA> 2 2 1 1
[12] 1 <NA> 2 <NA> 2 <NA> <NA> 2 <NA> <NA> 1
[23] 2 1 1
Levels: 1 2 <NA>
Comment puis-je sous-ensemble de ce facteur par le <NA>
niveau?Les deux méthodes que j'ai essayé ne fonctionne pas.
> x[is.na(x)]
factor(0)
Levels: 1 2 <NA>
> x[x=='<NA>']
factor(0)
Levels: 1 2 <NA>
La solution
Surprenant pour moi que vos tentatives pour faire cela ne fonctionne pas, mais cela semble:
x[is.na(levels(x)[x])]
J'y suis arrivé en regardant str(x)
et de voir qu'il est la les niveaux qui sont NA
, pas le sous-jacent codes:
str(x)
Factor w/ 3 levels "1","2",NA: 1 2 2 3 1 3 3 2 2 1 ...
Autres conseils
Le suivi de Ben:
str(x)
vous montre le problème.Les facteurs sont stockés comme des entiers en interne avec une "recherche" de toutes sortes.Donc:
> all(is.na(x))
[1] FALSE
mais
> any(is.na(levels(x)))
[1] TRUE
et comme ben l'a montré, pour imprimer les valeurs réelles du vecteur:
> levels(x)[x]
[1] "1" "2" "2" NA "1" NA NA "2" "2" "1" "1" "1" NA "2" NA "2" NA NA "2" NA NA "1" "2" "1" "1"
rapport
> x
[1] 1 2 2 <NA> 1 <NA> <NA> 2 2 1 1 1 <NA> 2 <NA> 2 <NA> <NA> 2 <NA> <NA> 1 2 1 1
Levels: 1 2 <NA>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow