Créer plusieurs conditions dans un if / est-ce possible d'utiliser un %not in%

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

Elodie Perron
Messages : 19
Enregistré le : 18 Mai 2018, 06:36

Créer plusieurs conditions dans un if / est-ce possible d'utiliser un %not in%

Messagepar Elodie Perron » 09 Déc 2019, 11:15

Bonjour à tous,

J'ai suis bloquée pour un problème très simple... je m'explique :

J'ai deux colonnes :

Code : Tout sélectionner

code_NAF   forme_juridique
4598A   Personnes morales
5367Z   Personnes physiques
7415Z   Association
7963Z   Syndic
5214A   Association
9853Z   Personnes morales
7852Z   Personnes physiques
4598A   Personnes morales
5367Z   Personnes physiques
7415Z   Association
7963Z   Syndic
5214A   Association
9853Z   Personnes morales
7852Z   Personnes physiques
4598A   Personnes morales
5367Z   Personnes physiques
7415Z   Association
7963Z   Syndic
5214A   Association
9853Z   Personnes morales
4598A   Personnes physiques
5367Z   Personnes morales
7415Z   Personnes physiques
7963Z   Syndic



- Une colonne CODE_NAF
- Une forme_juridique : (Association ; Personnes physiques ; personnes morales ; Syndic)


A partir de ces deux colonnes, je souhaiterais créer une variable "Segmentation" avec les critères ci-dessous :
- Si code_NAF=="5367Z" ou code_naf=="4598A" ou code_naf=="7415Z" & forme_juridique=="Personnes physiques" alors Segmentation==Prof_lib
- Si code_NAF!="5367Z" ou code_naf!="4598A" ou code_naf!="7415Z" & forme_juridique=="Personnes physiques" alors Segmentation==EI
- Si code_NAF=="5367Z" ou code_naf=="4598A" ou code_naf=="7415Z" & forme_juridique=="Personnes morales" alors Segmentation==Prof_lib
- Si code_NAF!="5367Z" ou code_naf!="4598A" ou code_naf!="7415Z" & forme_juridique=="Personnes morales" alors Segmentation==Sociétés
- Si forme_juridique=="Association" alors Segmentation==Association
- Si forme_juridique=="Syndic" alors Segmentation==Syndic

J'ai donc fais le code suivant :

Code : Tout sélectionner

for (i in 1:nrow(clipro)) {
if(clipro[i,"CODE_NAF]" %in% c(5367Z","4598A","7415Z") & forme_juridique=="Personnes physiques") {
clipro[i,'segmentation'] <- Prof_lib
}
else if(clipro[i,"CODE_NAF]" %in% c(5367Z","4598A","7415Z") & forme_juridique=="Personnes morales") {
clipro[i,'segmentation'] <- Prof_lib
}
else if(clipro[i,"CODE_NAF]"!="5367Z" | clipro[i,"CODE_NAF]"!="4598A" | clipro[i,"CODE_NAF]"!="7415Z") & forme_juridique=="Personnes morales") {
clipro[i,'segmentation'] <- Sociétés
}
else if(clipro[i,"CODE_NAF]"!="5367Z" | clipro[i,"CODE_NAF]"!="4598A" | clipro[i,"CODE_NAF]"!="7415Z") & forme_juridique=="Personnes physiques") {
clipro[i,'segmentation'] <- EI
}
else if(forme_juridique=="Association") {
clipro[i,'segmentation'] <- Association
}
else if(forme_juridique=="Syndic") {
clipro[i,'segmentation'] <- Syndic
}
}


Ce code ne marche pas.Il m'affiche que les sociétés et prof lib. Est-ce là bonne méthode le signe "!=", n'y a-t-il pas un moyen de simplifier ?

Je vous remercie par avance pour votre aide !!

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Créer plusieurs conditions dans un if / est-ce possible d'utiliser un %not in%

Messagepar Jean-Emmanuel Longueville » 09 Déc 2019, 12:00

Pour l'écriture %not in% vous pouvez utiliser
!(a %in% c("Toto", "tata"))
! est une fonction qui inverse un booléen TRUE devient FALSE et inversement
Jean-Emmanuel
Ingénieur d'étude LNEC

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Créer plusieurs conditions dans un if / est-ce possible d'utiliser un %not in%

Messagepar François Bonnot » 09 Déc 2019, 14:01

Bonjour,
1) La boucle est inutile
2) Pour plus de clarté, mieux vaut écrire proprement les conditions et les traiter ensuite, par exemple (pour les 2 premières):

Code : Tout sélectionner

condition1 <- with(clipro,code_NAF %in% c("5367Z","4598A","7415Z") & forme_juridique=="Personnes physiques")
condition2 <- with(clipro,code_NAF %in% c("5367Z","4598A","7415Z") & forme_juridique=="Personnes morales")

clipro[condition1,"segmentation"] <- "Prof_lib"
clipro[condition2,"segmentation"] <- "EI"

(Vérifiez que vos conditions sont correctes... ça ne semble pas le cas pour votre condition 3)
EDIT: mon code contenait une coquille qu j'ai rectifiée
François

Elodie Perron
Messages : 19
Enregistré le : 18 Mai 2018, 06:36

Re: Créer plusieurs conditions dans un if / est-ce possible d'utiliser un %not in%

Messagepar Elodie Perron » 10 Déc 2019, 10:59

Concernant la 3ème condition il n'y avait pas d'erreur (les Prof lib peuvent être des personnes morales ou physiques), c'est pour ça qu'apparaît deux fois "Prof_Lib"
Merci beaucoup pour vos réponses !!

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Créer plusieurs conditions dans un if / est-ce possible d'utiliser un %not in%

Messagepar François Bonnot » 12 Déc 2019, 10:04

Concernant la 3ème condition il n'y avait pas d'erreur

Bonjour,
Ma remarque concernait la syntaxe, en effet la condition

Code : Tout sélectionner

clipro[i,"CODE_NAF]"!="5367Z" | clipro[i,"CODE_NAF]"!="4598A" | clipro[i,"CODE_NAF]"!="7415Z"

est toujours vraie quelle que soit la valeur de CODE_NAF.
François

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Re: Créer plusieurs conditions dans un if / est-ce possible d'utiliser un %not in%

Messagepar matthieu faron » 13 Déc 2019, 09:08

Bonjour,

Il y aussi la fonction case_when() du package dplyr qui permet de faire des conditions if imbriquées.

Personnellement je la trouve un peu plus claire dans ces situations en limitant le recopiage du nom du data_frame etc... mais c'est juste personnel !

Bonne journée
Matthieu FARON


Retourner vers « Questions en cours »

Qui est en ligne

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