Problème boucle if et valeur manquante

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

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Problème boucle if et valeur manquante

Messagepar Séverine Bayle » 15 Fév 2017, 09:23

Bonjour,

Je dispose d'un data frame où chaque ligne est une entreprise. Je souhaite rajouter une colonne "catégorie" pour déduire le type de l'entreprise en fonction de son effectif. Pour cela, je fais :

Code : Tout sélectionner

data$categorie=NULL
for (i in 1:nrow(data)){
  if (data$Effectif<10) {
    data$categorie="TPE"
    }
  if (data$Effectif>=10 & data$Effectif<249) {
    data$categorie="PME"
    }
  if (data$Effectif>=250 & data$Effectif<4999) {
    data$categorie="ETI"
    }
  if (data$Effectif>4999) {
    data$categorie="GE"
    }
}


Mais R m'indique :
Error in if (data$Effectif < 10) { :
missing value where TRUE/FALSE needed
In addition: Warning message:
In if (data$Effectif < 10) { :
the condition has length > 1 and only the first element will be used

Je ne comprends pas... Effectivement j'ai des valeurs manquantes dans ma colonne "effectif", mais cela ne devrait pas avoir d'impact sur le résultat de ma boucle. Quelqu'un peut-il m'aider à comprendre?

Merci par avance.

Séverine

Jérémy Jachacz
Messages : 153
Enregistré le : 15 Avr 2014, 12:56

Re: Problème boucle if et valeur manquante

Messagepar Jérémy Jachacz » 15 Fév 2017, 10:36

Bonjour,

le problème ici vient du fait que vous utilisez une boucle sans l'utiliser..
en ajoutant un moyen d'identifier les lignes et par la même occasion à la boucle de fonctionner :

Code : Tout sélectionner

if (data$Effectif[i,]<10) {
    data$categorie[i,]="TPE"
    }


ça devrait mieux fonctionner

il me semble que la fonction if ne fonctionne pas sur un vecteur de taille superieur à 1 (autrement dit : il fonctionne case par case) sauf avec ifelse() mais qui est valable pour deux conditions uniquement.

ici on pourrait faire des ifelse() en cascade mais je pense qu'il y a mieux à faire.. attendons une solution meilleure

Jeremy
Statisticien (69)

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Problème boucle if et valeur manquante

Messagepar Pierre-Yves Berrard » 15 Fév 2017, 12:38

Bonjour,

On peut utiliser cut() :

Code : Tout sélectionner

(x <- sample(6000, 30))

cut(
  x,
  breaks = c(0, 10, 250, 5000, Inf),
  labels = c("TPE", "PME", "ETI", "GE"),
  right = FALSE
)

Attention, le résultat est un facteur.
PY

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

Re: Problème boucle if et valeur manquante

Messagepar Logez Maxime » 15 Fév 2017, 12:57

Bonjour,

dans le même ordre d'idée que cut mais en conservant une chaîne de caractères :

Code : Tout sélectionner

# remplace x par data$Effectif
c("TPE", "PME", "ETI", "GE")[findInterval(x, c(0, 10, 249, 4999, Inf))]
Cordialement,
Maxime

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Re: Problème boucle if et valeur manquante

Messagepar Séverine Bayle » 15 Fév 2017, 14:07

Merci de m'avoir fait remarquer mon erreur... Effectivement sous la pression j'ai complètement zappé le i dans la boucle...

Merci! :)

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Problème boucle if et valeur manquante

Messagepar Pierre-Yves Berrard » 16 Fév 2017, 10:58

À noter que, de la façon dont vous avez spécifié vos intervalles, 249 et 4999 ne seront jamais affectés à une catégorie.

Et pour info, findInterval() est ~10 fois plus rapide que cut() et au moins 500 fois plus rapide que la boucle for() !
PY


Retourner vers « Questions en cours »

Qui est en ligne

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