2017-10-19 6 views
0

J'utilise le package hochet pour effectuer un nettoyage de données et je considère la première variable X dans mon ensemble de données. Il signale, quand je fais dans le premier onglet, l'onglet "Données", j'obtiens quelques bases de l'ensemble de données et il dit que la variable X qui a 1243 valeurs manquantes. C'est aussi la valeur que j'obtiens si j'utilise sum(is.na(my_df[,1])).Existe-t-il différents types de NA?

Sur l'onglet suivant, l'onglet « Explorer », quand je vérifie « Résumé », il dit maintenant que je viens de 942 dans la variable X. NAs

Comment puis-je donne un sens à ces chiffres différents? J'ai manuellement parcouru un peu mon ensemble de données et j'ai regardé quelques lignes qui avaient des NA et ces NA se ressemblent tous (je comprends qu'il y a parfois différents types d'AN).

(question Side: sum(is.na(my_df[,1]), na.rm = FALSE) et sum(is.na(my_df[,1]),na.rm = TRUE) également les deux produisent le même nombre 1243, pourquoi je me serais attendu que l'on me donne length(my_df[,1])-1243?.)


EDIT est le jeu de données ici qui a ce problème : https://wetransfer.com/downloads/cf454b2c12857a4e3770102a7222422f20171019153755/516fb0. Les chiffres sont légèrement différents, au lieu de 1243, nous avons 88 NA selon l'onglet "Données" dans rattle() (ou, de manière équivalente, selon summary(ten_df)), et 62 NA selon le "Explore" avec l'onglet Résumé vérifié.

Mais maintenant je soupçonne que mon jeu de données est cassé parce qu'avant de télécharger le jeu complet, je voulais initialement télécharger seulement une colonne illustrative. Mais quand j'exécute

ten_df = read.csv("ten.csv",sep=";") 
my_df = as.data.frame(ten_df[,3]) 

que je veux regarder la troisième colonne avec var2 et my_df était ce que je voulais télécharger l'origine, la dernière commande renvoie une erreur

Warning messages: 
1: In rep(no, length.out = length(ans)) : 
    'x' is NULL so the result will be NULL 

En outre, lors de la sélection après my_df pour l'analyser avec hochet, hochet dit "0 variable d'entrée" dans la barre en bas où il donne un retour. Comment se peut-il?

+0

Quant à votre question de côté, 'is.na' ne peut revenir' TRUE/FALSE', argument 'na.rm' est hors de propos . Pour voir ceci, essayez 'x <- c (1: 3, NaN, NA, 4, 5, NA); sum (is.na (x)) '. En ce qui concerne la différence dans les valeurs rapportées des valeurs manquantes, il est difficile de dire sans voir les données. Je ferais confiance 'summary (X)'. –

+0

@RuiBarradas Merci! – billyboy

Répondre

3

?NA

NA est une constante logique de longueur 1, qui contient un indicateur valeur manquante. NA peut être contraint à tout autre type de vecteur sauf brut. Il y a des constantes aussi NA_integer_, NA_real_, NA_complex_ et NA_character_ des autres types de vecteurs atomiques qui prennent en charge les valeurs manquantes : tous ces éléments sont des mots réservés dans la langue de R.

class(NA)    # "logical" 
class(NA_integer_) # "integer" 
class(NA_real_)  # "numeric" 
class(NA_complex_) # "complex" 
class(NA_character_) # "character" 
is.na(NA)    # TRUE 
is.na(NA_integer_) # TRUE 
is.na(NA_real_)  # TRUE 
is.na(NA_complex_) # TRUE 
is.na(NA_character_) # TRUE 
identical(NA,NA_integer_) # FALSE 
identical(NA,NA_real_)  # FALSE 
identical(NA,NA_complex_) # FALSE 
identical(NA,NA_character_) # FALSE 
identical(NA_character_,as.character(NA)) # TRUE 
identical(NA_real_,as.numeric(NA))  # TRUE 
identical(as.logical(NA_real_),NA)  # TRUE 

Alors NA est un logical. Alors pourquoi utilisons-nous NA presque partout sans nous soucier de la classe?en raison des règles de coercition:

class(c(NA,1)[1])    # "numeric" 
identical(c(NA,1),c(NA_real_,1)) # TRUE 
c(NA_character_,1)    # [1] NA "1" 

Selon class, NA peut également être imprimé différemment

Revenons maintenant à votre question, je ne peux pas répondre à la première parce que vous offrez pas de données reproductibles, mais pour pourquoi sum(is.na(my_df[,1]), na.rm = FALSE) et sum(is.na(my_df[,1]),na.rm = TRUE), c'est parce que is.na(my_df[,1]) est seulement faite de TRUE et FALSE, pas NA s.

Vous pouvez également essayer length(na.omit(my_df[,1])).

EDIT:

Une colonne donnée d'un data.frame ne comporte que des éléments d'une classe, vous aurez donc pas différent NA_character_ et NA_real_ dans la même colonne.

Quelque chose qui arrive souvent cependant, c'est que vous aurez des chaînes dont la valeur est "NA", vous ne devriez pas attendre is.na pour les détecter. Dans ces cas, vous pouvez utiliser df[df == "NA"] <- NA avoir NA régulièrement s au lieu de "NA" chaînes dans votre data.frame

+0

Merci, c'est une très bonne réponse en profondeur jusqu'à maintenant, j'ai beaucoup appris de vous! Je souhaite que je pourrais upvote, mais je peux le faire seulement après que j'ai 15 points de rep; une fois que j'atteins cela, j'essaierai d'y revenir rétrospectivement. J'ai également téléchargé l'ensemble de données, pourriez-vous y jeter un coup d'oeil, de sorte que la première réponse puisse également être répondue? – billyboy

+0

malheureusement, je ne peux pas accéder à ce site depuis mon ordinateur de travail, mais je suppose que sum (is.na (df [, 1])) 'vous donnera la bonne réponse, et pour une raison quelconque, les valeurs alternatives vous trouver sont soit pas à jour ou juste une estimation. Cela aiderait vraiment à voir une contradiction à travers les commandes de code et pas ce que vous voyez dans les onglets :). Vous pouvez également couper votre ensemble de données à une taille raisonnable et l'explorer manuellement, ce n'est déjà pas si grand. –