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 :

Simplification de code


Sujet :

R

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Simplification de code
    Bonjour

    J'ai deux tableaux qui se ressemblent un peu.
    Dans le tableau pedi, j'ai une liste d'individus avec des ages
    Dans le tableau tab, j'ai certains individus de pedi, mais pas tous et certains sont présent sur plusieurs lignes car répondent à 1,2,3 etc évènements

    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
    25
    26
     
    ID2=c("a","b","c","d","d","e","f","g", "h", "i","j", "k", "l","m","n","n","o", "p","q","r", "s","t","u","v","w","x","y","z")
    Ag2= c(46, 50, 30, 28, 36,29, 27, 32, 33, 21, 32, 32, 32, 32, 23, 29, 27, 27, 30, 32, 31, 29,25,36,47,27,36,41)
    pedi=data.frame(ID2,Ag2)
     
    > head(pedi)
      ID2 Ag2
    1   a  46
    2   b  50
    3   c  30
    4   d  28
    5   d  36
    6   e  29
     
    ID=c("a","a","b","c","c","c","c","d","d","e","e","e","e","f","f","g","g","g","g", "h", "i", "i","j", "k", "l", "l", "l","m","m","n","n","o", "p", "p","p","q","r", "s","s","t","t")
    Ag= c(46, 46, 50, 30, 30, 30, 30, 28, 28, 36, 36, 36, 36, 29, 29, 27, 27, 27, 27, 32, 33, 33, 21, 32, 32, 32, 32, 32, 32, 23, 23, 29, 27, 27, 27, 30, 32, 31, 31, 29, 29)
    tab=data.frame(ID, Ag)
     
    > head(tab)
      ID Ag
    1  a 46
    2  a 46
    3  b 50
    4  c 30
    5  c 30
    6  c 30
    J'aimerai calculer le % d'individus de pedi répondant à 0,1,2 etc évènements en fonction de l'age

    J'ai commencé un code qui permet d'obtenir cela, mais j'aimerai pouvoir simplifier l'étape avec le ifelse, car si un jour je me retrouve à devoir faire ce type de calcul mais avec un plus grand nombre de catégorie cela risque de faire vraiment trop long à écrire.

    Autre soucis procédant comme cela, c'est que pour avoir le % d'individus ne répondant à aucun individus (présent dans pedi mais non dans tab, je suis obligée de rajouter encore un grand nombre d'étape).


    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    library(tidyverse)
    library(tidyr)
     
    pedi2= pedi  %>%
      group_by(Ag_int=cut(Ag2, breaks=c(20,30,40,50)))%>% 
      count()
     
    pedi2=as.data.frame(pedi2)
     
    > pedi2
       Ag_int  n
    1 (20,30] 13
    2 (30,40] 11
    3 (40,50]  4
     
    tab2 = tab  %>%
      group_by(Ag_int=cut(Ag, breaks=c(20,30,40,50)), .drop = FALSE)%>%
      group_by(ID, .add=TRUE, .drop=FALSE)%>%
      count() %>% 
      mutate(number=n)%>%
      group_by(Ag_int, .drop = FALSE) %>%
      group_by(number, .add=TRUE, .drop = FALSE)%>%
      count()%>% 
      ungroup() %>%  
      complete(number, Ag_int,fill=list(n=0))%>%  
      mutate(pct = ifelse(Ag_int=="(20,30]", round(n/pedi2[1,2]*100,2), 
                          ifelse(Ag_int=="(30,40]",round(n/pedi2[2,2]*100,2), 
                                 ifelse(Ag_int=="(40,50]", round(n/pedi2[3,2]*100,2), 0
                                        ))) )
     
    > tab2
    # A tibble: 12 x 4
       number Ag_int      n   pct
        <int> <fct>   <dbl> <dbl>
     1      1 (20,30]     3 23.1 
     2      1 (30,40]     3 27.3 
     3      1 (40,50]     1 25   
     4      2 (20,30]     4 30.8 
     5      2 (30,40]     3 27.3 
     6      2 (40,50]     1 25   
     7      3 (20,30]     1  7.69
     8      3 (30,40]     1  9.09
     9      3 (40,50]     0  0   
    10      4 (20,30]     2 15.4 
    11      4 (30,40]     1  9.09
    12      4 (40,50]     0  0
    Alors j'aimerai savoir si quelqu'un aurait des idées pour

    • simplifier cela (notamment en calculant le pourcentage de façon plus automatique, que manuelle pour ne pas avoir à écrire un calcul pour chaque groupe d'age, mais en écrire un qui s'applique à tous en même temps)
    • pouvoir obtenir le % d'individus ne répondant à aucun évènement.



    Merci d'avance pour votre aide,

    Aline

  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 : 46
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Aline.
    Je ne sais pas si c'est beaucoup plus simple, mais je découpe en étapes pour visualiser les résultats intermédiaires. Et une jointure au lieu des ifelse (qui seraient déjà plus lisibles s'ils étaient remplacés par un case_when).
    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
    library(tidyverse)
     
    num <- tab %>% 
      group_by(ID, Ag) %>% 
      summarise(number = n()) %>% 
      group_by(number, Ag_int=cut(Ag, breaks=c(20,30,40,50))) %>% 
      summarise(num = n()) %>% 
      ungroup()
     
    denom <- pedi %>% 
      group_by(Ag_int=cut(Ag2, breaks=c(20,30,40,50))) %>% 
      summarise(denom = n()) %>% 
      ungroup() 
     
    num %>% 
      full_join(denom, by="Ag_int") %>% 
      complete(number, Ag_int, fill=list(num=0, denom=0)) %>% 
      mutate(pct = coalesce(num/denom * 100, 0))
    Bon courage.
    Olivier

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    En réadaptant un peu, cela marche très bien sur mes données. Merci pour votre aide.

    Aline

Discussions similaires

  1. Simplification de code
    Par lodan dans le forum Langage
    Réponses: 4
    Dernier message: 20/09/2006, 19h28
  2. Simplification de code
    Par lodan dans le forum Langage
    Réponses: 2
    Dernier message: 31/08/2006, 21h51
  3. Simplification de code (suite)
    Par Jeffboj dans le forum Access
    Réponses: 1
    Dernier message: 12/04/2006, 22h34
  4. simplification de code
    Par Jeffboj dans le forum Access
    Réponses: 11
    Dernier message: 11/04/2006, 15h09
  5. [c#] Simplification de code
    Par Revan012 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/02/2006, 16h44

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