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 :

[dplyr] Créer une variable avec une condition


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Par défaut [dplyr] Créer une variable avec une condition
    Bonsoir à toutes est à tous,

    Je programme en SAS tous les jours et je souhaite me mettre un peu à R. La philosophie n'a pas l'air d'être la même...
    J'ai suivi quelques cours trouvés sur internet et je voudrais maintenant faire mes propres trucs, notamment du reporting de résultat avec ReporteRs, mais ça je verrais plus tard.

    Là je bloque dès le début ! Je voudrais créer créer quelques variables toutes simples. Vu que j'ai vu que le package dplyr servait à faire pas mal de gestion de données je me suis dis pourquoi ne pas utiliser la fonction mutate() qui apparemment permet de faire des choses intéressantes. Sur un dataset tout simple je veux affecter une valeur selon une condition :

    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
    18
    19
    20
    21
     
    # Packages installation
    install.packages("dplyr")
    install.packages("tidyr")
     
    # Loading packages
    library(dplyr)
    library(tidyr)
     
    # Dataset - ChickWeight
    View(ChickWeight)
     
     
    # Class of weight and period
    ChickWeight2 <- mutate(ChickWeight,
                           if (Time <= 10) {
                             Period == "Period 1"
                           } else if (Time > 10) {
                             Period == "Period 2"
                           }
                          )
    Et je récupère directement ça comme message :

    Warning message:
    In if (Time <= 10) { :
    the condition has length > 1 and only the first element will be used


    J'ai cherché un peu sur internet mais je ne trouve pas de solution. Apparemment sur certaines choses ils proposent ifelse mais ça n'a pas l'air de fonctionner non plus.

    Pourriez-vous m'aider avec ce petit problème ? Après ça je m'attèlerai à toutes les étapes de dérivations et programmations à coups de merges, transpose, retain...

    Merci beaucoup !

    alers

  2. #2
    Membre expérimenté Avatar de Alpacky
    Homme Profil pro
    .
    Inscrit en
    Mars 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Mars 2014
    Messages : 99
    Par défaut
    Hello,

    L'erreur vient du fait que tu appliques une condition if sur un vecteur donc R te dit qu'il testera ta condition sur le premier élément du vecteur uniquement.
    Il y a qqs autres erreurs dans ton code notamment dans l'utilisation de mutate pour créer la colonne Period et quand tu remplis Period:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ChickWeight2 <- mutate(ChickWeight,
                           if (Time <= 10) {
                             Period == "Period 1"
                           } else if (Time > 10) {
                             Period == "Period 2"
                           }
                          )
    Avec mutate tu utilises une syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mutate(data, newvar = ...)
    Ici newvar est Period. Lorsque tu veux remplir Period selon ta condition tu utilises "==" or pour assigner en R c'est "<-", si tu utilises == tu réalises un test d'égalité.

    Utiliser ifelse n'est pas une mauvaise idée, une possibilité ci-après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ChickWeight2 <- mutate(ChickWeight, Period = ifelse(Time <= 10, yes = "Period 1", no = "Period 2")
    en gros ifelse te permets d'appliquer le test Time <= 10 en chaque element de ton vecteur, si la réponse est oui alors tu mets period1 sinon period2.
    De plus je nesais pas si tu devrais mettre des espaces dans tes noms de labels (Period_1 ou period1 seront plus simple à gérer je pense).

  3. #3
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    Pour compléter la réponse de Alpacky, quand tu es dans un cas binaire comme celui-ci il est plus efficace de créer un vecteur qui contient les résultats d'une des deux conditions et de modifier les valeurs de ce vecteur quand la deuxième condition est vérifiée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ChickWeight$Period  <- "Period 1"
    ChickWeight$Period[ChickWeight$Time > 10] <- "Period 2"
    cdlt

Discussions similaires

  1. [XL-2010] definir une variable avec une partie d'une cellule excel
    Par Jazza dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/09/2016, 17h19
  2. Réponses: 3
    Dernier message: 09/03/2016, 16h23
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. Réponses: 9
    Dernier message: 08/07/2009, 17h10
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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