calcule d'un pourcentage

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

calcule d'un pourcentage

Messagepar Aline Tavaud » 02 Mar 2021, 10:25

Bonjour,

Je viens à nouveau faire appel à vous car je suis bloquée dans une analyse.
J'ai un tableau avec trois colonnes. La première correspond a des individus, la deuxième à leur statut (1 vs 2), et la troisième indique une valeur yes/no.

Code : Tout sélectionner

ind=c("a","b","c","d","e","f","g","a","b","e","a","c","h")
stat=c("1","2","2","1","1","2","2","1","2","1","1","2","1")
present=c("yes","yes","no","yes","no","yes","no","yes","no","no","no","yes","no")
tab=data.frame(ind,stat,present)

 ind stat present
1    a    1     yes
2    b    2     yes
3    c    2      no
4    d    1     yes
5    e    1      no
6    f    2     yes
7    g    2      no
8    a    1     yes
9    b    2      no
10   e    1      no
11   a    1      no
12   c    2     yes
13   h    1      no



Je souhaite calculer le % d'individus unique portant un yes / no en fonction de leur statut.
Pour cela, je groupe les individus par statut, ensuite je les groupe par yes/no puis j'enlève les lignes pour lesquelles j'ai un "doublon" individu, je compte tout ça mais ensuite j'ai un problème pour calculer le pourcentage car je veux le % en fonction du statut mais en prenant en compte tous les individus uniques de chaque statut. En gros je veux que le sum(n) de mon calcule de % (voir dernière dernière ligne) soit égale à 4 (voir deuxième code) et non à 3+2 et 3+3 comme ce serait le cas avec le sum(n). Le problème c'est que il y a des individus qui seraient compté deux fois dans ce cas car ils sont à la fois dans le yes et à la fois dans le no (exemple: individu a). Je voulais pouvoir à nouveau enlever les doublons après avoir dégroupé, et regroupé par status mais je n'ai plus accès à la colonne ind pour enlever les doublons.

Auriez vous une idée pour m'aider à résoudre ce problème,

Code : Tout sélectionner

library(tidyverse)

tab3 = tab  %>%
  group_by(stat)%>%
  group_by(present, .add = TRUE)%>%
  distinct(ind, .keep_all = TRUE) %>%
  count() %>%
  ungroup() %>%
  group_by(stat) %>%
  mutate(pct = round(n/sum(n)*100,2),)
 
 
   stat  present     n
  <chr> <chr>   <int>
1 1     no          3
2 1     yes         2
3 2     no          3
4 2     yes         3
 
 


Code : Tout sélectionner



tab2 = tab  %>%
  group_by(stat)%>%
  distinct(ind, .keep_all = TRUE) %>%
  count()
 
    stat      n
  <chr> <int>
1 1         4
2 2         4


Merci d'avance

Bien cordialement

Aline

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: calcule d'un pourcentage

Messagepar Aline Tavaud » 02 Mar 2021, 13:06

Rebonjour,

J'ai réussi à m'en sortir en faisant en 2 étapes (voir ci dessous), mais si vous avez plus simple, je suis preneuse.

Code : Tout sélectionner


tab2 = tab  %>%
  group_by(stat)%>%
  distinct(ind, .keep_all = TRUE) %>%
  count()
 
tab2=as.data.frame(tab2)
   
tab3 = tab  %>%
  group_by(stat)%>%
  group_by(present, .add = TRUE)%>%
  distinct(ind, .keep_all = TRUE) %>%
  count() %>%
  ungroup() %>%
  group_by(stat) %>%
  mutate(pct = ifelse(stat==1, round(n/tab2[1,2]*100,2) , round(n/tab2[2,2]*100,2))) %>%

# A tibble: 4 x 4
# Groups:   stat [2]
  stat  present     n   pct
  <chr> <chr>   <int> <dbl>
1 1     no          3    75
2 1     yes         2    50
3 2     no          3    75
4 2     yes         3    75
> tab  %>%



Merci d'avance,

Bien cordialement

Aline

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: calcule d'un pourcentage

Messagepar Mickael Canouil » 02 Mar 2021, 16:46

Bonjour,

il y a plusieurs façon de faire avec dplyr (vraiment plusieurs et même trop), mais en voici une :

Code : Tout sélectionner

tab <- data.frame(
  ind = c("a", "b", "c", "d", "e", "f", "g", "a", "b", "e", "a", "c", "h"),
  stat = c("1", "2", "2", "1", "1", "2", "2", "1", "2", "1", "1", "2", "1"),
  present = c("yes", "yes", "no", "yes", "no", "yes", "no", "yes","no", "no", "no", "yes", "no")
)

Code : Tout sélectionner

library(dplyr)
tab %>% 
  group_by
(stat) %>% 
  mutate
(n_tot = n_distinct(ind)) %>%
  distinct() %>%
  group_by(present, .add = TRUE) %>% 
  summarise
(= n(), pct = n() / n_tot * 100, .groups = "drop") %>% 
  distinct
()
#> # A tibble: 4 x 4
#>   stat  present     n   pct
#>   <chr> <chr>   <int> <dbl>
#> 1 1     no          3    75
#> 2 1     yes         2    50
#> 3 2     no          3    75
#> 4 2     yes         3    75   


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité