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 :

Boucler avec DPLYR


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Par défaut Boucler avec DPLYR
    bonjour,

    Je dois analyser une base de données avec un grand nombre de variables ayant toutes des noms différents (pas de suffixes ou de préfixes).
    Sur cette base de données, je souhaite effectuer une commande basique : créer une nouvelle ligne par individu contenant la soustraction entre deux temps de mesures pour toutes mes variables quantitatives. Seulement, je voudrais automatiser en définissant par exemple une liste contenant le nom des variables. Dans l'exemple, ci dessous j'ai réduit à 2 variables mais j'en ai 200 avec des noms différents. J'utilise le package dplyr mais je ne vois pas comment faire pour automatiser. Peut être ajouter cette commande dans une fonction pour utiliser une liste ?

    Voici un exemple de comment est formatée la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    set.seed(20200312)
    data <- data.frame(
      individu = rep(paste("R", 1:50, sep =""), each = 2), 
      temps= rep(c(1, 2), 50), 
      var1 = rnorm(100), 
      var2 = rnorm(100), 
      stringsAsFactors = FALSE
    )

    La commande que je souhaite appliquer (soustraction entre les deux temps de mesure pour l'ensemble des individus) sur quasiment toutes mes variables de la base de données (d'où la recherche d'automatisation car elles ont toutes un nom différent et pas de suffixe comme dans l'exemple ci-dessous) est la suivante :

    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
     
    library(dplyr)
     
    data %>% 
      group_by(individu) %>% 
      arrange(temps) %>% 
      do(bind_rows(  
        .,
        summarise(., 
                  individu = unique(individu),
                  temps = 3,
                  var1 = first(var1) - last(var1)
                  var2 = first(var2) - last(var2)
     
     
        )
      )) %>% 
      ungroup() %>% 
     arrange(individu, temps)
    J'ai tenté un début mais ça ne fonctionne pas et je ne suis pas certaine d'utiliser la meilleure option

    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
    22
    23
    24
     
    liste_var<-c("var1",var2")
     
    boucle<-function(X)
    {
    data %>% 
      group_by(individu) %>% 
      arrange(temps) %>% 
      do(bind_rows(  
        .,
        summarise(., 
                  individu = unique(individu),
                  temps = 3,
                  var1 = first(var1) - last(var1)
                  var2 = first(var2) - last(var2)
     
     
        )
      )) %>% 
      ungroup() %>% 
     arrange(individu, temps)
    }
     
    boucle(liste_var)
    N'hésitez pas si besoin de complément sur ce que je souhaite faire ou le code.
    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Bonjour.
    Peut-être quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data2 <- data %>%
                group_by(individu) %>%
                arrange(temps) %>%
                summarise(across({{liste_var}},
                                    ~ last(.x) - first(.x))) %>%
                ungroup()
    si j'ai bien compris le besoin. Reste juste à constituer liste_var, peut-être à partir de colnames(data) ? et d'un setdiff pour exclure certaines variables comme individu ou temps ?

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Par défaut
    Merci pour votre retour Olivier, je me suis inspirée de ce début de code pour l'appliquer sur ma base de données.

Discussions similaires

  1. [Batch] Boucler avec FOR sur requête PSQL
    Par xiiviiix dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 19/03/2018, 16h50
  2. Réponses: 7
    Dernier message: 27/08/2015, 10h47
  3. Réponses: 5
    Dernier message: 19/05/2015, 02h38
  4. Boucler sur les éléments d'un ListView avec For Each
    Par c.piette dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/04/2015, 15h53
  5. Réponses: 7
    Dernier message: 29/01/2009, 13h32

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