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
J'aimerai calculer le % d'individus de pedi répondant à 0,1,2 etc évènements en fonction de l'age
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'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).
Alors j'aimerai savoir si quelqu'un aurait des idées pour
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
- 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
Partager