[RESOLU] Ajout des Lignes et Colonnes Total à l'aide de tidyverse

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

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

[RESOLU] Ajout des Lignes et Colonnes Total à l'aide de tidyverse

Messagepar Jean-Emmanuel Longueville » 27 Juin 2019, 15:41

Bonjour,
Je cherche à ajouter les valeurs de sommes des lignes et des colonnes sur le résultat des commandes

Code : Tout sélectionner

table
et

Code : Tout sélectionner

survey::svytable
.
Je cherche à le faire sans utiliser plusieurs variable au milieu.
Et naturellement à avoir les colonnes et lignes Total en dernière position.
Voici un ecm :

Code : Tout sélectionner

res <- data.frame(
Type_diplome = c("M2", "M2", "M2", "M2", "M2", "MEEF", "M2", "M2", "M2",
                      "M2", "M2", "LP", "LP", "M2", "M2", "M2",
                      "MEEF", "LP", "MEEF"),
statut_reponse = c("internet", "internet", "internet", "internet", "internet",
                   "téléphone","internet", "internet", "téléphone", "internet",
                   "internet", "téléphone", "téléphone", "téléphone",
                   "téléphone", "refus", "refus", "refus", "refus")
)

table(res$Type_diplome,
      res$statut_reponse)                                   %>% 
  cbind(table(donnee$ins$Type_diplome, donnee$ins$dip)[,2]) %>%
  as.data.frame() %>% rename("Diplomé" = starts_with("V"))  %>%
  bind_rows(., colSums(.) )                                 %>%
  mutate("Diplôme"  = c(unique(donnee$res$Type_diplome), "Total"),
         "Total"   = colSums(.) )                          %>%
  plyr::arrange()
kable(format = "latex", booktabs = TRUE)


Mes problèmes avec cet ecm réside surtout sur
-1 comment éviter la perte des rownames pour éviter d'avoir à reconstruire la première colonne ?
-2 comment utiliser la fonction arrange pour avoir pos 1 la colonne reconstruite (sauf si vous avez une solution à 1) et comment avoir Total en dernière colonne ?
Merci déjà d'en être arrivé ici.
Jean-Emmanuel
Ingénieur d'étude LNEC

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Ajout des Lignes et Colonnes Total à l'aide de tidyverse

Messagepar Logez Maxime » 27 Juin 2019, 16:22

Bonjour,

as-tu regardé du côté de addmargins ?

Code : Tout sélectionner

addmargins(with(res, table(Type_diplome, statut_reponse)))

Cordialement,
Maxime

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Ajout des Lignes et Colonnes Total à l'aide de tidyverse

Messagepar Jean-Emmanuel Longueville » 28 Juin 2019, 07:33

non je ne connaissais pas cette fonction.
Merci je vais creuser
Jean-Emmanuel
Ingénieur d'étude LNEC

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

Re: Ajout des Lignes et Colonnes Total à l'aide de tidyverse

Messagepar Mickael Canouil » 28 Juin 2019, 08:39

Bonjour,

l'approche tidyverse peut ressembler à ça:

Code : Tout sélectionner

res <- data.frame(
  Type_diplome = c(
    "M2", "M2", "M2", "M2", "M2", "MEEF", "M2", "M2", "M2",
    "M2", "M2", "LP", "LP", "M2", "M2", "M2",
    "MEEF", "LP", "MEEF"
  ),
  statut_reponse = c(
    "internet", "internet", "internet", "internet", "internet",
    "téléphone", "internet", "internet", "téléphone", "internet",
    "internet", "téléphone", "téléphone", "téléphone",
    "téléphone", "refus", "refus", "refus", "refus"
  ),
  stringsAsFactors = FALSE
)


Code : Tout sélectionner

as.data.frame(addmargins(with(res, table(Type_diplome, statut_reponse))))
#>    Type_diplome statut_reponse Freq
#> 1            LP       internet    0
#> 2            M2       internet    9
#> 3          MEEF       internet    0
#> 4           Sum       internet    9
#> 5            LP          refus    1
#> 6            M2          refus    1
#> 7          MEEF          refus    2
#> 8           Sum          refus    4
#> 9            LP      téléphone    2
#> 10           M2      téléphone    3
#> 11         MEEF      téléphone    1
#> 12          Sum      téléphone    6
#> 13           LP            Sum    3
#> 14           M2            Sum   13
#> 15         MEEF            Sum    3
#> 16          Sum            Sum   19


Code : Tout sélectionner

library(tidyverse)

res %>%
  count(statut_reponse, Type_diplome) %>%
  group_by(statut_reponse) %>%
  do(bind_rows(
    .,
    summarise(., Type_diplome = "total", statut_reponse = unique(statut_reponse), n = sum(n))
  )) %>%
  ungroup() %>%
  bind_rows(
    .,
    filter_all(., all_vars(. != "total")) %>%
      summarise(statut_reponse = "total", Type_diplome = "total", n = sum(n))
  )
#> # A tibble: 11 x 3
#>    statut_reponse Type_diplome     n
#>    <chr>          <chr>        <int>
#>  1 internet       M2               9
#>  2 internet       total            9
#>  3 refus          LP               1
#>  4 refus          M2               1
#>  5 refus          MEEF             2
#>  6 refus          total            4
#>  7 téléphone      LP               2
#>  8 téléphone      M2               3
#>  9 téléphone      MEEF             1
#> 10 téléphone      total            6
#> 11 total          total           19


Il y a peut-être plus direct comme approche pour le résultat final que vous souhaitez, mais je n'ai pas pu reproduire votre code ("donnee" n'est pas fourni)

Si vous avez besoin de faire apparaître les 0, il y a la fonction tidyr::complete()

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

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: [RESOLU] Ajout des Lignes et Colonnes Total à l'aide de tidyverse

Messagepar Jean-Emmanuel Longueville » 28 Juin 2019, 09:53

L'ajout de la fonction addmargins dans la suite de code m'a suffit l'idée est quand même de présenté un tableau simple et clair à des personnes peu habituée.

Merci beaucoup pour vos réponses et votre précieuse aide.

voici mon code final :

Code : Tout sélectionner

table(donnee$res$Type_diplome,
      donnee$res$statut_reponse)                              %>% 
    cbind(table(donnee$ins$Type_diplome, donnee$ins$dip)[,2]) %>%
    addmargins()                                              %>%
    as.data.frame() %>% rename("Diplomé" = starts_with("V"))  %>%
    kable(format = "latex", booktabs = TRUE)
Jean-Emmanuel
Ingénieur d'étude LNEC


Retourner vers « Questions en cours »

Qui est en ligne

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