IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

l'argument n'est ni numérique, ni logique : renvoi de NA


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut l'argument n'est ni numérique, ni logique : renvoi de NA
    Bonjour,

    Je suis débutant sur R et je bute depuis plus d'une heure sur quelque chose de tout bête j'imagine...

    J'ai importé une base de donnée en csv. Ce qui m'intéresse, c'est la colonne X4.2.Age. Le problème, c'est qu'à l'intérieur, il y a des données manquantes pour 3 personnes sur passé 900. Sauf erreur, mon problème devrait venir de là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # répertoire d'importation
    setwd("C:/R/Travail final 2.0")
     
    # importation du CSV (export excel) avec la Database totale
    Database<-read.csv("BaseData.csv",header=TRUE,sep=";",na.strings="")
     
    x=(X4.2.Age)
    plot(x, main="Âge de l'échantillon",ylab="Effectif par âge",xlab="N=982 ")
     
    text1=mean(x)
    text2=median(x)
    text(60, 140, paste(text1, "Moyenne"))
    text(60, 130, paste(text1, "Médianne"))
    Quand j'essaie de faire la moyenne ou la médiane, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Warning message:
    In mean.default(x) :
      l'argument n'est ni numérique, ni logique : renvoi de NA
    Même avec la fonction as.numeric ça ne passe pas.

    Quelqu'un aurait une idée ?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Que renvoient str(Database) et str(x) ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > str(x)
     Factor w/ 66 levels "11","12","13",..: 33 4 33 10 18 38 16 29 9 33 ...
    > str(Database)
    'data.frame':	984 obs. of  618 variables:

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Je me trouve dans la même situation qu'angelbann. J'ai un tableau avec plusieurs colonnes mais elles n'ont pas toutes la même longueur et lorsque j'essaye de faire une moyenne ligne par ligne avec apply() il me renvoi le même message "l'argument n'est ni numérique, ni logique : renvoi de NA".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file$MEAN<-apply(file,1,mean,na.rm=TRUE)
    Personne n'a trouvé de solution ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Un factor dans R ne sert pas à stocker des nombres mais des "catégories", de ce fait faire la moyenne n'a aucun sens.
    Il faut donc convertir ces colonnes en un type plus adapté, par exemple en numeric avec as.numeric. Par contre les fonctions read.csv ou read.table sont censées déterminer quel est le type le plus adapté automatiquement, si elles y sont pas arrivé c'est surement qu'il y a un problème dans le fichier d'entrée (mauvais séparateur de décimale, données manquantes notées d'une façon inattendue etc.). Une fois le problème identifié il faut soit modifier le fichier d'entrée, soit paramétrer correctement read.csv.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    En fait, j'arrive très bien à manipuler mes données colonne par colonne donc le problème ne vient pas de mes fichiers de base ou de mon importation. De même en utilisant la fonction is.numeric() toutes les colonnes qui m'intéressent répondent "TRUE". Le problème ne vient pas de là, mais bien des NA.

    J'ai utilisé la nouvelle fonction cbind.na() pour fusionner mes tableaux entre eux car comme ils n'ont pas la même longueur cbind() ne fonctionnait pas, grâce à la nouvelle fonction je peux les combiner car les valeurs manquantes sont remplacées par des NA. Mais je n'arrive pas à dire à R de ne pas considérer les NA ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    > file<-(cbind.na(doc1,doc2,doc3))
    > file$EVENT<-gl(5, 1, length=nrow(file), label=c("event1","event2","event3","event4","event5"))
    > file$MEAN<-apply(file,1,mean,na.rm=TRUE)
    There were 50 or more warnings (use warnings() to see the first 50)
    > warnings()
    Messages d'avis :
    1: In mean.default(newX[, i], ...) :
      l'argument n'est ni numérique, ni logique : renvoi de NA
    2: In mean.default(newX[, i], ...) :
      l'argument n'est ni numérique, ni logique : renvoi de NA
     
     
    ...etc et ça continue 50 fois ...

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Les NA ne posent aucun problème pour faire une moyenne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    > x=c(1,2,NA)
    > mean(x)
    [1] NA
    > mean(x,na.rm=T)
    [1] 1.5
    Le problème vient bien de ta variable qui est un factor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > str(x)
     Factor w/ 66 levels "11","12","13",..: 33 4 33 10 18 38 16 29 9 33 ...

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Quand j'utilise la fonction str() je vois qu'en effet mes variables ne sont pas considérées comme numériques mais comme "int". Pourtant lorsque j'utilise la fonction is.numeric() la réponse est TRUE ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    > str(file)
    'data.frame':	3599 obs. of  10 variables:
     $ TIME109: int  0 0 100 521759 521760 521763 522160 522161 526165 526165 ...
     $ TIME113: int  0 0 100 85787 85788 85793 86188 86189 90194 90194 ...
     $ TIME114: int  0 0 100 22610 22610 22616 23010 23011 27016 27016 ...
     $ TIME115: int  0 0 100 14281 14281 14284 14681 14682 18686 18686 ...
     $ TIME116: int  0 0 100 1335 1336 1338 1736 1737 5741 5741 ...
     $ TIME117: int  0 0 100 1021 1022 1023 1422 1423 5429 5429 ...
     $ TIME118: int  0 0 100 887 888 890 1288 1289 5293 5293 ...
     $ TIME119: int  0 0 100 561 562 564 962 963 4967 4967 ...
     $ EVENT  : Factor w/ 9 levels "event1","event2",..: 1 2 3 4 5 6 7 8 9 1 ...
     $ MEAN   : num  NA NA NA NA NA NA NA NA NA NA ...
     
    > is.numeric(file$TIME109)
    [1] TRUE
    > is.numeric(file$TIME113)
    [1] TRUE
    Après le problème vient peut-être de ma colonne "EVENT" mais je ne vois pas comment dire à R de pas l'utiliser, ce ne sont même pas des nombres, et j'en ai fait un facteur exprès (chaque temps mesuré dans les colonnes "TIME" correspond à un évènement de la colonne "EVENT"). Ca me parait étrange qu'il y ai un problème à cause de ça.

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Les int (entiers) sont un type particulier de numeric, pas de soucis là-dessus.

    Quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file$MEAN<-apply(file,1,mean,na.rm=TRUE)
    Tu demandes une moyenne de chaque ligne de ta dataframe, sans enlever la colonne EVENT.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Je pensais qu'en indiquant que la colonne EVENT est un facteur j'éviterais justement ce genre de problème. J'essaye d'exclure EVENT de ma formule mais ça ne semble pas changer grand chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > file$MEAN<-apply(file[,!(names(file)%in%c(file$EVENT))],1,mean,na.rm=TRUE)
    There were 50 or more warnings (use warnings() to see the first 50)
     
    > warnings()
    Messages d'avis :
    1: In mean.default(newX[, i], ...) :
      l'argument n'est ni numérique, ni logique : renvoi de NA
    2: In mean.default(newX[, i], ...) :
      l'argument n'est ni numérique, ni logique : renvoi de NA
     
    ... etc ...
    Comment je peux exclure cette colonne ?

  11. #11
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file[,names(file)!="EVENT"]

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Super ça fonctionne
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Erreur "Argument n'est pas facultatif"
    Par karaveland dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/06/2011, 17h30
  2. Réponses: 15
    Dernier message: 23/01/2010, 11h04
  3. Vérifier qu'un champs est un numérique
    Par olivier94 dans le forum Langage
    Réponses: 2
    Dernier message: 18/02/2007, 21h21
  4. passer une fonction en argument, c'est possible ?
    Par kamouminator dans le forum C
    Réponses: 4
    Dernier message: 10/11/2006, 21h13
  5. Savoir si un string est un numérique
    Par Homer dans le forum Langage
    Réponses: 3
    Dernier message: 05/10/2005, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo