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