J'ai une trame de données avec un tas de variables catégoriques. Certains d'entre eux contiennent des NA et j'utilise la fonction Voici mes exemples de données et tentent de "trouver" NA: P> addna code> pour les convertir en un niveau de facteur explicite. Mon problème vient lorsque j'essaie de les traiter comme Na, ils ne semblent pas s'inscrire.
df1 <- data.frame(id = 1:200, y =rbinom(200, 1, .5),
var1 = factor(rep(c('abc','def','ghi','jkl'),50)))
df1$var2 <- factor(rep(c('ab c','ghi','jkl','def'),50))
df1$var3 <- factor(rep(c('abc','ghi','nop','xyz'),50))
df1[df1$var1 == 'abc','var1'] <- NA
df1$var1 <- addNA(df1$var1)
df1$isNaCol <- ifelse(df1$var1 == NA, 1, 0);summary(df1$isNaCol)
df1$isNaCol <- ifelse(is.na(df1$var1), 1, 0);summary(df1$isNaCol)
df1$isNaCol <- ifelse(df1$var1 == 'NA', 1, 0);summary(df1$isNaCol)
df1$isNaCol <- ifelse(df1$var1 == '<NA>', 1, 0);summary(df1$isNaCol)
3 Réponses :
Test d'égalité à NA CODE> avec les opérateurs de comparaison habituels TOUJOURS donné
NA code> --- Vous voulez
is.na code>. En outre, appeler
is.na code> sur un facteur code> Testez chaque index de niveau (pas la valeur associée à cet index), vous souhaitez donc convertir le facteur
> à un
caractère code> vecteur d'abord.
df1$isNaCol <- ifelse(is.na(as.character(df1$var1)), 1, 0);summary(df1$isNaCol)
@Gavinsimpson Voir mon commentaire sur la question. Quelque chose est différent de nos configurations. Je ne reçois pas la sortie dans votre réponse.
Tout ce qui est comparé à Na est na; C'est pourquoi votre premier résumé est tout na. p>
Le Pour voir combien d'observations ont le niveau NA, utilisez ce que Matthew Plourde a affiché. P> Addna code> La fonction modifie toutes les observations de NA sur votre facteur à un nouveau niveau. Ce niveau est ensuite donné le étiquette em> na (de mode de caractère). La variable sous-jacente elle-même n'a plus de NAS. C'est pourquoi votre deuxième résumé est tout 0. P>
Ça est instructif de voir quoi Pour regarder l'aide pour Si nous examinons la définition de addna () code> stry>.
addna () code> avec ces données. p>
addna code> modifie les niveaux em> du facteur tel que manquant-ness (
na code >) Est-ce qu'un niveau où par défaut, l'ignore-le comme quel niveau les valeurs
NA code> est bien sûr manquante. Il s'agit également de l'information
na code> - dans un sens, il n'est plus inconnu mais une partie d'une catégorie "manquante". P>
addna code> US
? addna code>. p>
addna code> Nous voyons que tout ce qu'il fait est de modifier les niveaux P>
> with(df1, table(var1, useNA = "ifany"))
var1
abc def ghi jkl <NA>
0 50 50 50 50
Je reçois une sortie différente pour avec (df1, tête (is.na (var1), 10)) code> (tout
false code>)
@Matthewplourde pas ici. Je viens de reconstruire des données de l'OP à vérifier. Et redémarré R pour vérifier. C'est aussi ce que is.na () code> fait aussi longtemps que je peux me souvenir. Il n'y a pas d'étiquettes VS NUMÉMENTS NUMÉROS ICI - La valeur est
na code> et
is.na () code> vous informe de cela.
hmm ... quelle version de r (3.0.1 ici)? Je viens de redémarrer la vanille et obtenez la même sortie qu'auparavant.
@Matthewplourde r version 3.0.1 (2013-05-16) code>
@Gavingsimpson bien qui a beaucoup de sens. Je suppose que vous l'avez essayé avec une session propre?
@Matthewplourde Oui, redémarré pour vérifier. Exécutez-vous cela après i> addna code> a été appelé? ou avant? Je n'exécute pas le
addna code> étape, comme cela semble superflu à ce que veut OP.
@Matthewplourde et oui, je vois maintenant: essayez is.na (addna (df1 $ var1)) code> et vous verrez le problème.
addna code> se débarrasse des informations
na code>.
après. Ce n'est pas superflu. Il ajoute Na comme un niveau, remplaçant les index na avec l'index du niveau NA. Voir as.numeric (df1 $ var1) code> avant et après le code> addna code> étape. Donc, si vous voulez avoir NA comme niveau, vous auriez besoin de convertir en personnage avant de faire ce que veut.
@Matthewplourde à droite, par superflu, je ne vois vraiment pas pourquoi addna code> doit venir dans ce domaine. En faisant
na code> un niveau que vous avez dit efficacement que ce n'est pas
na code> mais une partie d'une catégorie
na code> (ou manquant - non indiqué). Dans quel cas
is.na () code> est juste, s'il est confus, quand il indique qu'aucune valeur n'est
na code> dans le facteur i>. Je ne vois pas le point d'ajouter
na code> de manière persistante ici - peut-être que c'est un exemple artificiel ou une petite partie d'une analyse plus grande, mais il me semble que
addna < / Code> est peut-être utilisé mieux à la volée où vous souhaitez inclure
NA code> comme niveau et donc compté.
D'accord. Eh bien, si OP a besoin de Na comme un niveau ou non, il a une réponse pour chaque cas.
@Matthewplourde en effet. La discussion est peut-être une seule sémantique. Je pense que vous avez répondu à la question posée, alors que je réponds à une question différente, qui me semble plus naturelle, mais peut-être pas à l'OP :-)
Fwiw,
tout (is.na (as.character (df1 $ var1))) code> retourne
vrai code> ... Mais je ne sais pas pourquoi ça ne marche pas directement ...
x = facteur ('a'); x [1] = na; addna (x); is.na (x) code> retourne
true code> est-ce qu'il devrait ...
@Justin Lorsque vous définissez
x [1] = na code>, vous définissez l'index de niveau sur NA, pas la valeur. Voir
as.numérique (x) code> vs
as.numérique (df1 $ var1) code>.
is.na code> regarde les index de niveau.