Problème fonction if:valeur manquante vrai/faux

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Mokhtaria Benaouali
Messages : 15
Enregistré le : 18 Fév 2019, 12:21

Problème fonction if:valeur manquante vrai/faux

Messagepar Mokhtaria Benaouali » 09 Mai 2019, 12:40

Bonjour ,
je travaille sur une longue table avec 2 colonnes (id et cmd),je voulais supprimer les id ou le cmd=27/90
[id cmd]
[1 24]
[2 26]
[3 28]
[4 NA]
[5 27]
[6 90]

l

Code : Tout sélectionner

time1<-Sys.time()
long_tabl=nrow(test_01_02)
i=1
repeat{
  if(i<=long_tabl){
   print(test_01_02$CMD[i])
    if(test_01_02$CMD[i]=="90" | test_01_02$CMD[i]=="27" ){
      test_01_02<- test_01_02[!(test_01_02$id==test_01_02$id[i]),]
      i=1
      long_tabl=nrow(test_01_02)
    }
    else {
      i=i+1
    }
  }
  else{
    break
  }
}
time2<-Sys.time()
difftime(time2, time1)


mais il bloque sur la ligne ou il y a cmd=NA et il m'affiche une erreur :une valeur manquante
Error in if (test_01_02$CMD[i] == "90" | test_01_02$CMD[i] == "27") { :
missing value where TRUE/FALSE needed


Merci d’avance
MimiaBenna

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Problème fonction if:valeur manquante vrai/faux

Messagepar Logez Maxime » 09 Mai 2019, 12:49

Bonjour,

Le problème vient des NA, tu ne peux pas comparer un NA à une valeur d'où ton message. La comparaison NA == 90 renvoie un NA qui n'est pas une condition valable, un booléen (FALSE, TRUE) donc le if ne fonctionne pas.

Une solution serait de rajouter une condition qui se doit d'être la première, pour tester si le CMD est un NA ou non, pour conserver ou non le NA : is.na(test_01_02$CMD[i]) | ...

Après le plus simple et le plus efficace en R est de vectoriser les calculs, c'est à dire d'effectuer le calcul sur toutes les valeurs d'un vecteur en même temps, plutôt que valeurs par valeurs. Bien entendu ce n'est pas toujours possible.

Ici tu peux le faire via l'opérateur "%in%" qui est un alias de la fonction match.

Code : Tout sélectionner

test_01_02[!test_01_02$CMD %in% c("27", "90"),]
On recherche d'abord si les valeurs de CMD sont égales à 27 ou 90 et ensuite on prend le négatif de ça à l'aide du point d'exclamation placé devant. De plus les NA sont gérés, il devrait être conservés ici.

Cordialement,
Maxime

Mokhtaria Benaouali
Messages : 15
Enregistré le : 18 Fév 2019, 12:21

Re: Problème fonction if:valeur manquante vrai/faux

Messagepar Mokhtaria Benaouali » 09 Mai 2019, 13:13

Merci Maxime pour ton retour.
j'ai rajouté une condition pour vérifier si le CMD est un NA ou non comme tu m'a dis et ça fonctionne bien.

PS: En faite je ne peux pas utiliser l'opérateur "%in%" parce que j'ai des cas ou pour le même identifiant a plusieurs ligne donc ça ne m'arrange pas.

Merci beaucoups
Cordialement
MimiaBenna

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Problème fonction if:valeur manquante vrai/faux

Messagepar Logez Maxime » 09 Mai 2019, 13:17

Re,


Mokhtaria Benaouali a écrit :PS: En faite je ne peux pas utiliser l'opérateur "%in%" parce que j'ai des cas ou pour le même identifiant a plusieurs ligne donc ça ne m'arrange pas.
Je ne vois pas ce qui pose problème par rapport à "%in%" et le fait que tu es plusieurs fois le même CMD, sauf si c'est la première occurrence de chaque nombre que tu ne veux pas conserver.

Cordialement,
Maxime

Mokhtaria Benaouali
Messages : 15
Enregistré le : 18 Fév 2019, 12:21

Re: Problème fonction if:valeur manquante vrai/faux

Messagepar Mokhtaria Benaouali » 09 Mai 2019, 13:32

oui je ne veux pas conserver les identifiants ou il ont au moins un CMD=27/90
[id CMD]
[1 29]
[1 90]
[2 27]
[3 26]
[4 30]

donc mon nouveau tableau:
[id CMD]
[3 26]
[4 30]

Cordialemnt
MimiaBenna


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron