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 :

boucle if, ifelse


Sujet :

R

  1. #1
    Membre à l'essai
    Homme Profil pro
    AgroParisTech
    Inscrit en
    Mai 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : AgroParisTech
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2020
    Messages : 22
    Points : 19
    Points
    19
    Par défaut boucle if, ifelse
    Bonjour à tous,

    Voici un exemple de mon dataframe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    df <- data.frame(parcelle = c(11, 12, 13, 14, 15, 16),
                     nb1  = c(0,1,3,0,4,9),
                     nb2 = c(5,4,1,5,6,0),
                     nb3 = c(1,0,2,0,6,0))
    J'aimerai effectuer une boucle qui teste les colonnes nb1, nb2 et nb3 et qui retranscrit la valeur (soit 0, soit 1) dans une nouvelle colonne :

    si (nb1 + nb 2) > 4 alors 1
    ou si (nb1 + nb 2) > 2 et que nb3 >= 1 alors 1
    ou si nb3>=2 alors 1
    sinon 0


    Voici ce vers quoi j'aimerai aboutir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    df2 <- data.frame(parcelle = c(11, 12, 13, 14, 15, 16),
                     nb1  = c(0,1,3,0,4,9),
                     nb2 = c(5,4,1,5,6,0),
                     nb3 = c(1,0,2,0,6,0),
                     resultat = c(0,1,1,1,1,0))
    La colonne "resultat" correspond à la nouvelle colonne où la valeur du test y est retranscrite.

    Merci.

    Cordialement,
    David

  2. #2
    Membre averti
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Points : 343
    Points
    343
    Par défaut
    Hello,

    Ce bout de code peut t'aider à construire ta variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    df$res <- ifelse( ( df$nb1 + df$nb2 ) > 4 
                          || (( df$nb1 + df$nb2 ) > 2 & df$nb3 >= 1) 
                          || df$nb3 >=2 
                      , 1 ,0   )

  3. #3
    Membre à l'essai
    Homme Profil pro
    AgroParisTech
    Inscrit en
    Mai 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : AgroParisTech
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2020
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci pour ce premier bout de code, ça à l'air de fonctionner.

    Plus qu'à trouver le moyen de pouvoir effectuer ce code ligne par ligne. Pour l'instant cette partie de code effectue le test uniquement sur la première ligne et applique le résultat obtenu sur l'ensemble de la colonne.

    Si vous avez une idée, je suis preneur....

    Merci.


    Bonne journée,
    David

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut ifelse
    Bonjour,

    Les opérations s'effectuent en parallèle sur les différentes lignes. Il faut une seule barre verticale pour l'opérateur OU.

    Par ailleurs votre dataframe exemple n'est pas très satisfaisant puisqu'il ne permet pas de tester les différents cas.

    Je vous propose celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df <- data.frame(parcelle = c(11, 12, 13, 14),
    +                  nb1  = c(0,1,0,1),
    +                  nb2 = c(5,2,0,2),
    +                  nb3 = c(1,1,2,0))
    > df$res <- ifelse((df$nb1 + df$nb2) > 4 
    +                   | ((df$nb1 + df$nb2) > 2 & df$nb3 >= 1) 
    +                   | df$nb3 >=2
    +                   ,1 ,0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    > df
      parcelle nb1 nb2 nb3 res
    1       11   0   5   1   1   --> nb1+nb2 > 4
    2       12   1   2   1   1   --> nb1+nb2 > 2 & nb3 >= 1
    3       13   0   0   2   1   --> nb3 >= 2
    4       14   1   2   0   0   --> nb1+nb2 > 2 mais nb3 = 0
    Cordialement,

  5. #5
    Membre à l'essai
    Homme Profil pro
    AgroParisTech
    Inscrit en
    Mai 2020
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : AgroParisTech
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2020
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Super, merci beaucoup!

    Bonne journée à vous,
    David

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

Discussions similaires

  1. boucle Ifelse ne fonctionne pas
    Par mumu64 dans le forum R
    Réponses: 2
    Dernier message: 09/02/2017, 11h37
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 10h47
  4. Sortir d'un progamme qui boucle ou qui refresh
    Par mikevador02 dans le forum C
    Réponses: 12
    Dernier message: 14/12/2002, 09h38
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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