10
votes

Trouver des valeurs na après l'utilisation de Addna ()

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 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.

Voici mes exemples de données et tentent de "trouver" NA: P>

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)


2 commentaires

Fwiw, tout (is.na (as.character (df1 $ var1))) retourne vrai ... Mais je ne sais pas pourquoi ça ne marche pas directement ... x = facteur ('a'); x [1] = na; addna (x); is.na (x) retourne true est-ce qu'il devrait ...


@Justin Lorsque vous définissez x [1] = na , vous définissez l'index de niveau sur NA, pas la valeur. Voir as.numérique (x) vs as.numérique (df1 $ var1) . is.na regarde les index de niveau.


3 Réponses :


4
votes

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)


1 commentaires

@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.



3
votes

Tout ce qui est comparé à Na est na; C'est pourquoi votre premier résumé est tout na.

Le Addna La fonction modifie toutes les observations de NA sur votre facteur à un nouveau niveau. Ce niveau est ensuite donné le étiquette 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.

Pour voir combien d'observations ont le niveau NA, utilisez ce que Matthew Plourde a affiché.


0 commentaires

4
votes

Notez que cela se fait avec les données de l'OP avant em> l'appel sur addna () code> stry>.

Ça est instructif de voir quoi addna () code> avec ces données. p> xxx pré>

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>

Pour regarder l'aide pour addna code> US ? addna code>. p>

Si nous examinons la définition de 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


11 commentaires

Je reçois une sortie différente pour avec (df1, tête (is.na (var1), 10)) (tout false )


@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 () 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 et is.na () 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)


@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 addna a été appelé? ou avant? Je n'exécute pas le addna étape, comme cela semble superflu à ce que veut OP.


@Matthewplourde et oui, je vois maintenant: essayez is.na (addna (df1 $ var1)) et vous verrez le problème. addna se débarrasse des informations na .


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) avant et après le addna é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 doit venir dans ce domaine. En faisant na un niveau que vous avez dit efficacement que ce n'est pas na mais une partie d'une catégorie na (ou manquant - non indiqué). Dans quel cas is.na () est juste, s'il est confus, quand il indique qu'aucune valeur n'est na dans le facteur . Je ne vois pas le point d'ajouter na 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 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 :-)